我构建了一个基本内容提供商,用于存储用于学习目的的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;
}
据推测,我错过了一些非常明显的东西,并且发布这个问题会觉得很傻。
但目前我非常感谢任何帮助,因为我很难过。
答案 0 :(得分:5)
您的问题似乎与selection
有关,而不是与selectionArgs
本身有关。 selection
应该是“where”之后的整个查询。您selection
的{{1}}就是"CREATED_AT"
。您还需要两个项目才能使其正常工作:
=
,因为你想要平等(当然你也可以做其他的操作)?
。这是您的selectionArgument将被插入的位置(每个参数在选择中需要?
,因此选择中的?
个数应与selectionArguments相同。最终结果应该更像"CREATED_AT = ?"
有关如何正确构建ContentProvider查询的详细信息,请查看the documentation和this tutorial。
答案 1 :(得分:0)
查询内容提供商时,请尝试以下操作。选择应该是AlertContract.Column.CREATED_AT +“=?”
Cursor cursor = getContext().getContentResolver().query(AlertContract.CONTENT_URI, null, AlertContract.Column.CREATED_AT + "=?", selectionArgs, AlertContract.DEFAULT_SORT);