19

我正在尝试让我的 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

4 回答 4

26

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

final Cursor c = resolver.query(
        MyTable.CONTENT_URI,
        MyTable.PROJECTION,
        null,
        null,
        " limit 1 offset 2");
于 2012-09-28T13:31:27.923 回答
26

我使用语法 '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。小心不要对“,”进行编码,否则它将不起作用。

于 2012-11-21T17:53:13.360 回答
24

如果您提供内容提供者,那么您可以使用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 的回答
于 2014-06-05T08:39:54.900 回答
0

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

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

结合选择查询、排序和分组,这给了我很好的结果。

于 2015-03-09T06:44:01.043 回答