【问题标题】:Querying the ContentProvider for certain IDs查询特定 ID 的 ContentProvider
【发布时间】:2012-09-07 21:50:39
【问题描述】:

我有一个联系人表,我只需要获取某些 ID。

假设我有 10 个联系人,其 ID 从 1 到 10,我想获得一个 Cursor,其中联系人 1 和 2。

一个有效的代码是:

new CursorLoader(MyContentProvider.CONTACT_CONTENT_URI, null,
MyContentProvider.CONTACT_COLUMN_ID + " IN  ( 1, 2 )",
null, null);

我的问题是我无法使用selectionArgs 参数,因为转义会破坏查询。

您能想出一种使用selectionArgs 参数并使其工作的方法吗?

【问题讨论】:

    标签: android android-cursor android-cursorloader


    【解决方案1】:

    如果你想使用selectionArgs你只能像这样使用它

    String selection = "column IN (?, ?, ?)";
    String[] selectionArgs = { "1", "2", "3" };
    

    您需要在运行时根据参数的数量构建"( ?, ?, ? )" 字符串。例如

    private static String getSelection(int args) {
        StringBuilder sb = new StringBuilder(MyContentProvider.CONTACT_COLUMN_ID + " IN  (");
        boolean first = true;
        for (int i = 0; i < args; i ++) {
            if (first) {
                first = false;
            } else {
                sb.append(',');
            }
            sb.append('?');
        }
        sb.append(')');
        return sb.toString();
    }
    

    【讨论】:

    • 充其量,这仅适用于由 SQLite 或其他 SQL 兼容数据库支持的 ContentProvider。现在,在这种情况下,OP 可能正在查询 OP 自己的 ContentProvider 并且可以确保这将起作用,但这不是一种安全的技术,您不控制 ContentProvider 实现。
    • ContentProviderish 的方式是使用 Uri query parameters,但必须由 ContentProvider 实现。 ContentProvider 的整个 selection / selectionArgs API 过于以 SQL 为中心。
    • @CommonsWare:我没关系,ContentProvider 不会被导出。
    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多