如何在android上添加限制子句来管理

5 sqlite android

Android的API通过SQLite提供了一个干净的机制来查询联系人列表.但是,我不确定如何限制结果:

Cursor cur = ((Activity)mCtx).managedQuery(
                People.CONTENT_URI,
                columns,
                "LIMIT ? OFFSET ?",
                new String[] { Integer.toString(limit), Integer.toString(offset) },
                null
        );
Run Code Online (Sandbox Code Playgroud)

不行.

dha*_*g23 10

实际上,根据提供程序,您可以为URI附加限制,如下所示:

uri.buildUpon().appendQueryParameter("limit", "40").build()
Run Code Online (Sandbox Code Playgroud)

我知道MediaProvider处理这个问题,从查看最近的代码来看,你似乎也可以通过联系人来处理它.


Com*_*are 5

ContentProvider当您查询 Contacts 时,您访问的是,而不是 SQLite ContentProvider。该ContentProvider接口不LIMIT直接支持子句。

如果您直接访问自己的 SQLite 数据库,请使用rawQuery()on 方法SQLiteDatabase并添加LIMIT子句。


Jon*_*n O 5

我从这个bug中发现Android使用以下正则表达式来解析LIMIT查询的子句:

<framework/base/core/java/android/database/sqlite/SQLiteQueryBuilder.java>

使用以下sLimitPattern检查LIMIT子句.

private static final Pattern sLimitPattern = Pattern.compile("\\s*\\d+\\s*(,\\s*\\d+\\s*)?");
Run Code Online (Sandbox Code Playgroud)

请注意,正则表达式确实接受该格式,offsetNumber,limitNumber即使它不OFFSET直接接受该语句.


And*_*ess 4

我认为你必须手动执行此操作。从 ManagedQuery 调用返回的 Cursor 对象不会立即执行完整查询。您必须使用 Cursor.move*() 方法在结果集中跳转。

如果您想限制它,请在循环结果时创建您自己的限制。如果您需要分页,那么您可以使用 Cursor.moveToPosition(startIndex) 并从那里开始阅读。