指定ContentProvider查询的限制/偏移量

时间:2012-09-28 12:57:17

标签: android android-contentprovider

我正在尝试让我的ContentResolver运行此查询:

select * from myTable limit 1 offset 2

ContentResolver中唯一的查询方法是:

resolver.query(uri, projection, selection, selectionArgs, sortOrder);

我试过了:

final Cursor c = resolver.query(
        MyTable.CONTENT_URI,
        MyTable.PROJECTION,
        " ? ?",
        new String[] {"1", "2"},
        null);

只会抛出IllegaLArgumentException。 实现这一目标的正确方法是什么?

4 个答案:

答案 0 :(得分:24)

我把LIMIT子句放在sordOrder参数中,我也看到了其他人做同样的事情,但不确定它是否100%正确:

final Cursor c = resolver.query(
        MyTable.CONTENT_URI,
        MyTable.PROJECTION,
        null,
        null,
        " limit 1 offset 2");

答案 1 :(得分:23)

如果您要提供内容提供商,则可以使用android.net.Uri.Builder#appendQueryParameter提供限制和偏移量作为查询参数,内容提供商可以在构建查询时使用这些参数。

public class MyProvider extends ContentProvider {
    public static final String QUERY_PARAMETER_LIMIT = "limit";
    public static final String QUERY_PARAMETER_OFFSET = "offset";

    public Cursor query(Uri uri, ...) {
        String limit = uri.getQueryParameter(QUERY_PARAMETER_LIMIT);
        String offset = uri.getQueryParameter(QUERY_PARAMETER_OFFSET);

        SQLiteQueryBuilder builder = new SQLiteQueryBuilder();

        // set the table name,...

        // leaving handling of null conditions as an exercise to the reader.
        String limitString = offset + "," + limit;

        Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder, limitString);

        //...

        return c;
    }
}
构建查询时

private static final Uri CONTENT_URI = MyProvider.CONTENT_URI.buildUpon()
        .appendQueryParameter(MyProvider.QUERY_PARAMETER_LIMIT,
                    String.valueOf(limit))
        .appendQueryParameter(MyProvider.QUERY_PARAMETER_OFFSET,
                    String.valueOf(offset))
        .build();

请注意android.net.Uri.Builder#appendQueryParameter对值进行编码以防止sql注入。

参考文献:

  1. http://laviefrugale.blogspot.com/2012/01/using-limit-with-android-contentprovider.html
  2. http://www.sqlite.org/lang_select.html
  3. https://stackoverflow.com/a/12476458/1523910 + @eocanha's answer

答案 2 :(得分:22)

我使用语法'limit = offset limit '将limit子句作为查询参数:

Cursor c = context.getContentResolver().query(
        MyTable.CONTENT_URI.buildUpon().encodedQuery("limit="+offset+","+limit).build(),
        MyTable.PROJECTION,
        null,
        null,
        null);

它至少适用于MediaStore uris。小心不要编码“,”否则它将无效。

答案 3 :(得分:0)

当我尝试使用限制字符串[请参阅下面的限制字符串]时使用以下内容:

 StringBuilder sbLimit = new StringBuilder().append(" ").append(i_offset).append(" , ").append(i_limit);
String limit = sbLimit .toString()

这为我提供了与选择查询,排序和分组相结合的良好结果。