如何在android上向manageQuery添加限制子句
Posted
技术标签:
【中文标题】如何在android上向manageQuery添加限制子句【英文标题】:how add limit clause to manageQuery on android 【发布时间】:2010-11-08 19:13:34 【问题描述】:android 的 API 通过 SQLite 提供了一种干净的机制来查询联系人列表。但是,我不确定如何限制结果:
Cursor cur = ((Activity)mCtx).managedQuery(
People.CONTENT_URI,
columns,
"LIMIT ? OFFSET ?",
new String[] Integer.toString(limit), Integer.toString(offset) ,
null
);
没用。
【问题讨论】:
【参考方案1】:实际上,根据提供者,您可以将限制附加到 URI,如下所示:
uri.buildUpon().appendQueryParameter("limit", "40").build()
我知道 MediaProvider 可以处理这个问题,从查看最近的代码看来,您也可以使用联系人来处理。
【讨论】:
【参考方案2】:当您查询联系人ContentProvider
时,您访问的是ContentProvider
,而不是 SQLite。 ContentProvider
接口不直接支持LIMIT
子句。
如果您直接访问自己的 SQLite 数据库,请在 SQLiteDatabase
上使用 rawQuery()
方法并添加 LIMIT
子句。
【讨论】:
【参考方案3】:我从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
语句。
【讨论】:
感谢您让我的每一天、一周和一个月的答案!几周以来,我一直在寻找如何将“OFFSET”参数传递给数据库(通过ContentProvider
)而无需手动查询数据库(使用rawQuery(...)
方法)。
sqlite.org/lang_select.html(特别注意页面上的最后一段)
我想补充一点,如果您想使用无限制的偏移量,请使用 offsetValue, -1【参考方案4】:
我认为您必须手动执行此类操作。从 managedQuery 调用返回的 Cursor 对象不会立即执行完整查询。您必须使用 Cursor.move*() 方法来跳转结果集。
如果你想限制它,那么在循环结果时创建你自己的限制。如果需要分页,则可以使用 Cursor.moveToPosition(startIndex) 并从那里开始阅读。
【讨论】:
【参考方案5】:您可以在“order”参数中指定“limit”参数,如果您不想排序,甚至可以在其他参数中指定,因为届时您必须指定要排序的列:
mContentResolver.query(uri, columnNames, null, null, "id LIMIT 1");
【讨论】:
以上是关于如何在android上向manageQuery添加限制子句的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Azure 服务应用程序上向 docker run 添加其他选项