Android的API通过SQLite提供了一个干净的机制来查询联系人列表。但是,我不确定如何限制结果:
Cursor cur = ((Activity)mCtx).managedQuery(
People.CONTENT_URI,
columns,
"LIMIT ? OFFSET ?",
new String[] { Integer.toString(limit), Integer.toString(offset) },
null
);
不起作用。
答案 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");