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

时间:2009-07-07 18:23:21

标签: android sqlite

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

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

不起作用。

5 个答案:

答案 0 :(得分:10)

实际上,根据提供商的不同,您可以按如下方式为URI添加限制:

uri.buildUpon().appendQueryParameter("limit", "40").build()

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

答案 1 :(得分:5)

我从this 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*)?");

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:4)

当您查询联系人ContentProvider时,您正在访问ContentProvider,而不是SQLite。 ContentProvider接口不直接支持LIMIT子句。

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

答案 4 :(得分:4)

您可以在“order”参数中指定“limit”参数,如果您不想排序,甚至可以在其他参数中指定,因为您必须指定要排序的列:

mContentResolver.query(uri, columnNames, null, null, "id LIMIT 1");