如何使用选择args从android中的contentprovider查询特定行

时间:2014-09-09 22:11:31

标签: android sql sqlite android-contentprovider

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

但是我一直难以理解如何在我的提供者中为WHERE子句格式化选择参数:

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

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

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

整个数据库如下所示:

_id | CLIENTTRXID | CREATED_AT |类型| 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;
}

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

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

2 个答案:

答案 0 :(得分:5)

您的问题似乎与selection有关,而不是与selectionArgs本身有关。 selection应该是“where”之后的整个查询。您selection的{​​{1}}就是"CREATED_AT"。您还需要两个项目才能使其正常工作:

  1. 一个=,因为你想要平等(当然你也可以做其他的操作)
  2. a ?。这是您的selectionArgument将被插入的位置(每个参数在选择中需要?,因此选择中的?个数应与selectionArguments相同。
  3. 最终结果应该更像"CREATED_AT = ?"

    有关如何正确构建ContentProvider查询的详细信息,请查看the documentationthis tutorial

答案 1 :(得分:0)

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

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