【问题标题】:how add limit clause to manageQuery on android如何在android上向manageQuery添加限制子句
【发布时间】: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
        );

没用。

【问题讨论】:

    标签: android sqlite


    【解决方案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");
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-10-31
            • 2011-03-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-30
            • 2020-07-22
            相关资源
            最近更新 更多