如何使用内容提供程序添加限制子句

时间:2012-03-27 21:33:06

标签: android uri limit android-contentprovider

有没有办法限制从内容提供商返回的行数? 我找到了这个solution但是,它对我不起作用。所有行仍在返回。

Uri uri = Playlists.createIdUri(playlistId); //generates URI
uri = uri.buildUpon().appendQueryParameter("limit", "3").build();     
Cursor cursor = activity.managedQuery(playlistUri, null, null, null, null);

3 个答案:

答案 0 :(得分:34)

我遇到了这个问题,不得不打破我的脑袋,直到我终于明白了,或者更确切地说,这对我有用。请尝试以下

Cursor cursor = activity.managedQuery(playlistUri, null, null, null, " ASC "+" LIMIT 2");

最后一个参数是sortOrder。我提供了排序顺序,并附加了LIMIT。确保正确地给出空间。我必须检查正在形成的查询,这似乎有效。

答案 1 :(得分:3)

不幸的是,ContentResolver无法查询有限制参数。在您的ContentProvider中,您的MySQLQueryBuilder可以查询添加额外的限制参数。

遵循议程,我们可以在ContentProvider中添加额外的URI规则。

static final int ELEMENTS_LIMIT = 5;
public static final UriMatcher uriMatcher;

static {
uriMatcher = new UriMatcher( UriMatcher.NO_MATCH );
........
uriMatcher.addURI(AUTHORITY, "elements/limit/#", ELEMENTS_LIMIT);
}

然后在你的查询方法中

String limit = null; //default....
    switch( uriMatcher.match(uri)){
       .......
                case ELEMENTS_LIMIT:
                    limit = uri.getPathSegments().get(2);
                break;
       ......

            }

return mySQLBuilder.query( db, projection, selection, selectionArgs, null, null, sortOrder, limit );

从Activity中查询ContentProvider。

 uri = Uri.parse("content://" + ContentProvider.AUTHORITY + "/elements/limit/" + 1 );

//In My case I want to sort and get the greatest value in an X column. So having the column sorted and limiting to 1 works.
    Cursor query = resolver.query(uri,
                        new String[]{YOUR_COLUMNS},
                        null,
                        null,
                        (X_COLUMN + " desc") );

答案 2 :(得分:2)

内容提供商应根据一般原则注意限制参数。 不幸的是,它没有普遍实施。

例如,在编写内容提供程序以处理SearchManager查询时:

String limit = uri.getQueryParameter(SearchManager.SUGGEST_PARAMETER_LIMIT);

如果没有实现,你只能依赖于对sort子句限制的丑陋选项。