指定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。 什么是实现这个的正确方法?

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

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

如果您提供的是您的内容提供者,那么您可以使用android.net.Uri.Builder#appendQueryParameter提供限制和偏移作为查询参数,内容提供者在构build查询时可以使用这些参数。

 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; } } 

同时构build查询:

 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的答案

我使用语法“limit = offsetlimit ”将limit子句作为查询参数:

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

它至less与MediaStore uris一起工作。 小心不要编码“,”或它不会工作。

当我尝试使用下面的限制string[请参阅下面的string限制]:

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

这给了我很好的结果与select查询,sorting和分组结合。