如何在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添加限制子句的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上向用户付款

如何在 DiscordJS v13 上向用户添加角色?

如何在单个浏览器页面上向 Dash 应用程序添加多个图表?

如何在 Azure 服务应用程序上向 docker run 添加其他选项

如何在 current_page 上向 nav_link 添加更多元素?

如何在我的网站上向 Google 地图小部件添加用户输入标记,并从中获取纬度和经度数据?