有趣(故障)行为查询内容解析器
Funny(Glitchy) behaviour querying content resolver
我正在尝试使用 androids 电话内容提供程序进行一个小实验,所以我在主 activity 中编写了这段代码,以按 _id 降序获取 40 行
然后使用最后一行 id 在具有 _id < lastRowId
的另一个游标中再获取 20 行
Uri uri = Uri.parse("content://mms-sms/conversations");
Cursor cursor = getContentResolver().query(uri, new String[]{"_id", "ct_t"}, null, null,
"_id desc limit 40");
Log.d(TAG, "cursor: " + String.valueOf(cursor.getCount()));
cursor.moveToLast();
String lastId = String.valueOf(cursor.getInt(0));
Log.d(TAG, "Last cursor id: " + lastId);
cursor.close();
Cursor cursor2 = getContentResolver().query(uri, new String[]{"_id", "ct_t"}, "_id < ?", new String[] {lastId},
"_id desc limit 20");
Log.d(TAG, "cursor2: " + String.valueOf(cursor2.getCount()));
cursor2.moveToLast();
lastId = String.valueOf(cursor2.getInt(0));
Log.d(TAG, "Last cursor2 id: " + lastId);
cursor2.close();
这导致为 cursor2 返回 0 行并在尝试读取其第 0 列 (IndexOutOfBounds) 时发生崩溃,但有趣的是通过替换
Cursor cursor2 = getContentResolver().query(uri, new String[]{"_id", "ct_t"}, "_id < ?", new String[] {lastId},
"_id desc limit 20");
与
Cursor cursor2 = getContentResolver().query(uri, new String[]{"_id", "ct_t"}, "_id < 653", null,
"_id desc limit 20");
其中 653 存储在 lastId 中,我得到一个计数为 20 的有效游标
谁能帮我弄清楚问题出在哪里?
在查询方法的 API 中,他们说参数将是 bound as String
。在结果查询中,它们将显示为 '653'
,即使您可能认为它们应该显示为 653
。
SQLite 或 Java 接口,在比较不同的 arg 类型时看起来有那种奇怪的行为 SQLite rawQuery selectionArgs and Integers Fields。我们习惯于 Oracle、mysql 或任何 provider/language,它们在比较之前转换为上层类型。看起来 SQLite 比较结果为 false 而不是 castexception 或运行时或编译时所需的强制转换。
所以,当 int = str
是条件的一部分时,没有结果。
不错的发现。
我正在尝试使用 androids 电话内容提供程序进行一个小实验,所以我在主 activity 中编写了这段代码,以按 _id 降序获取 40 行 然后使用最后一行 id 在具有 _id < lastRowId
的另一个游标中再获取 20 行 Uri uri = Uri.parse("content://mms-sms/conversations");
Cursor cursor = getContentResolver().query(uri, new String[]{"_id", "ct_t"}, null, null,
"_id desc limit 40");
Log.d(TAG, "cursor: " + String.valueOf(cursor.getCount()));
cursor.moveToLast();
String lastId = String.valueOf(cursor.getInt(0));
Log.d(TAG, "Last cursor id: " + lastId);
cursor.close();
Cursor cursor2 = getContentResolver().query(uri, new String[]{"_id", "ct_t"}, "_id < ?", new String[] {lastId},
"_id desc limit 20");
Log.d(TAG, "cursor2: " + String.valueOf(cursor2.getCount()));
cursor2.moveToLast();
lastId = String.valueOf(cursor2.getInt(0));
Log.d(TAG, "Last cursor2 id: " + lastId);
cursor2.close();
这导致为 cursor2 返回 0 行并在尝试读取其第 0 列 (IndexOutOfBounds) 时发生崩溃,但有趣的是通过替换
Cursor cursor2 = getContentResolver().query(uri, new String[]{"_id", "ct_t"}, "_id < ?", new String[] {lastId},
"_id desc limit 20");
与
Cursor cursor2 = getContentResolver().query(uri, new String[]{"_id", "ct_t"}, "_id < 653", null,
"_id desc limit 20");
其中 653 存储在 lastId 中,我得到一个计数为 20 的有效游标
谁能帮我弄清楚问题出在哪里?
在查询方法的 API 中,他们说参数将是 bound as String
。在结果查询中,它们将显示为 '653'
,即使您可能认为它们应该显示为 653
。
SQLite 或 Java 接口,在比较不同的 arg 类型时看起来有那种奇怪的行为 SQLite rawQuery selectionArgs and Integers Fields。我们习惯于 Oracle、mysql 或任何 provider/language,它们在比较之前转换为上层类型。看起来 SQLite 比较结果为 false 而不是 castexception 或运行时或编译时所需的强制转换。
所以,当 int = str
是条件的一部分时,没有结果。
不错的发现。