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

Rol*_*and 3 sql sqlite android android-contentprovider

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

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

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

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

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

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

_id | CLIENTTRXID | CREATED_AT |类型| MESSAGEPRIO |留言|被接受

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

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

3 | 1 | 1410293471600 |测试类型1 ||测试| 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);
Run Code Online (Sandbox Code Playgroud)

似乎总是产生以下错误,无论我尝试作为selectionArgs

Exception caught? Cannot bind argument at index 1 because the index is out of range.  The statement has 0 parameters.
Run Code Online (Sandbox Code Playgroud)

这是我的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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

eme*_*sso 6

看起来你的问题是你的问题selection,而不是你自己的问题selectionArgs.本selection应是"在哪里"后,整个查询.在这里您selection"CREATED_AT".您还需要两个项才能使其工作:

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

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

有关如何正确构建ContentProvider查询的更多信息,请查看文档本教程.