我已经构建了一个基本的内容提供程序,用于存储用于学习目的的 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);
无论我尝试作为选择参数,似乎总是会产生以下错误
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;
}
想必我错过了一些非常明显的东西,并且会因为发布这个问题而感到很愚蠢。
但目前我非常感谢任何帮助,因为我很困惑。