小编典典

如何使用选择参数来查询Android中ContentProvider中的特定行

sql

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

但是我很困惑,试图弄清楚如何在我的提供程序中为WHERE子句设置选择args的格式:

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

说您的数据库有一个这样的条目,您试图访问它:

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

整个数据库如下所示:

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

1|1|1410293471000|test type 1||testing|0

2|1|1410293471300|test type 1||testing|0

3|1|1410293471600|test type 1||testing|0

在sql中,查询将为“从警报中选择_id,其中CREATED_AT = 1410293471300;”

我希望的代码可以做到这一点:

//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;
}

大概我错过了一些非常明显的东西,并且因为发布了这个问题而感到很傻。

但是目前我非常感谢任何帮助,因为我很沮丧。


阅读 149

收藏
2021-05-23

共1个答案

小编典典

看来您的问题出在您的上selection,而不是您自己的问题上selectionArgs。本selection应是“在哪里”后,整个查询。这selection是你的"CREATED_AT"。您还需要另外两项才能使其正常工作:

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

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

请查阅文档本教程,以获取有关如何正确构造ContentProvider查询的更多信息。

2021-05-23