gpt4 book ai didi

android - 如何使用选择参数从 android 中的内容提供者查询特定行

转载 作者:太空宇宙 更新时间:2023-11-03 12:18:19 24 4
gpt4 key购买 nike

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

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

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

假设您的数据库中有一个您尝试访问的条目:

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

整个数据库看起来是这样的:

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

大概我遗漏了一些非常明显的东西,并且会因为发布这个问题而感到很愚蠢。

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

最佳答案

看起来您的问题出在您的selection 上,而不是您的selectionArgs 本身。 selection 应该是“where”之后的整个查询。这里您的选择"CREATED_AT"。您还需要两项才能使其正常工作:

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

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

查看 the documentationthis tutorial有关如何正确构建 ContentProvider 查询的更多信息。

关于android - 如何使用选择参数从 android 中的内容提供者查询特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25754360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com