【问题标题】:How to use selection args to query specific rows from a contentprovider in android如何使用选择参数从 android 中的 contentprovider 中查询特定行
【发布时间】:2014-09-09 22:11:30
【问题描述】:

我已经构建了一个基本的内容提供程序,用于存储用于学习目的的 SMS 消息,到目前为止,我可以读取(无需选择 args)、插入、更新和删除。

但是,我一直难以弄清楚如何在我的提供程序中格式化 WHERE 子句的选择参数:

基本上我的应用程序需要搜索特定的时间戳(长格式)并返回它的_id

假设您的数据库有一个您尝试访问的类似条目:

2|1|1410293471300|测试类型1||测试|0

整个数据库看起来像这样:

_id|CLIENTTRXID|CREATED_AT|TYPE|MESSAGEPRIO|MESSAGE|ACCEPTED

1|1|1410293471000|测试类型 1||测试|0

2|1|1410293471300|测试类型1||测试|0

3|1|1410293471600|测试类型1||测试|0

在 sql 中,查询将是 "从 CREATED_AT=1410293471300 的警报中选择 _id;"

我希望的代码可以做同样的事情:

//normally i would get the string dynamically but to make it equal to the sql
String date = "1410293471300";
String[] selectionArgs = new String[]{ date };

Cursor cursor = getContext().getContentResolver().query(AlertContract.CONTENT_URI, null, AlertContract.Column.CREATED_AT, selectionArgs, AlertContract.DEFAULT_SORT);

无论我如何使用 selectionArgs,似乎总是会产生以下错误

Exception caught﹕ Cannot bind argument at index 1 because the index is out of range.  The statement has 0 parameters.

这里是我的contentprovider的查询方法:

    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
    qb.setTables( AlertContract.TABLE);

    switch (sURIMatcher.match(uri)) {
        case AlertContract.STATUS_DIR:
            break;
        case AlertContract.STATUS_ITEM:
            qb.appendWhere(AlertContract.Column.ID + "=" + uri.getLastPathSegment());
            break;
        default:
            throw new IllegalArgumentException( "illegal uri: " + uri);
    }
    String orderBy = (TextUtils.isEmpty(sortOrder)) ? AlertContract.DEFAULT_SORT : sortOrder;
    SQLiteDatabase db = dbHelper.getReadableDatabase();
    Cursor cursor = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);

    //register for uri changes
    cursor.setNotificationUri(getContext().getContentResolver(), uri);

    Log.d(TAG, "queried records: "+cursor.getCount());
    return cursor;
}

大概我错过了一些非常明显的东西,并且发布这个问题会觉得很傻。

但目前我非常感谢任何帮助,因为我很困惑。

【问题讨论】:

    标签: android sql sqlite android-contentprovider


    【解决方案1】:

    您的问题似乎出在您的 selection 上,而不是您的 selectionArgs 本身。 selection 应该是“where”之后的整个查询。你的selection"CREATED_AT"。您还需要两个项目才能使其工作:

    1. =,因为你想要相等(当然你也可以做其他运算符)
    2. ?。这是将插入您的 selectionArgument 的位置(每个参数在选择中需要一个 ?,因此选择中的 ?s 应该与 selectionArguments 相同。

    最终结果应该更像"CREATED_AT = ?"

    查看the documentationthis tutorial 了解有关如何正确构建 ContentProvider 查询的更多信息。

    【讨论】:

    • 感谢您和 CChi 的一百万:D,这在过去 2 小时内一直困扰着我,我选择了您的答案,因为它更详细一些,我希望我可以投票,但我我是 stackexchange 的新手,所以很遗憾缺乏声誉。
    • 很高兴我们能提供帮助。 :)
    【解决方案2】:

    当您查询内容提供者时,请尝试以下操作。选择应该是 AlertContract.Column.CREATED_AT + "=?"

    Cursor cursor = getContext().getContentResolver().query(AlertContract.CONTENT_URI, null, AlertContract.Column.CREATED_AT + "=?", selectionArgs, AlertContract.DEFAULT_SORT);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 2016-08-12
      • 2017-06-05
      相关资源
      最近更新 更多