我正在尝试使用androids电话内容提供程序进行小型实验,因此我在主要活动中编写了此代码,以便按_id降序排列40行 然后使用最后一行id在另一个具有_id<的游标中获得20多行lastRowId
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的有效游标
任何人都可以帮我解决问题所在吗?
答案 0 :(得分:2)
在查询方法的API中,他们说参数将是bound as String
。在生成的查询中,即使您认为它们应显示为'653'
,它们也会显示为653
。
SQLite或Java接口在比较不同的arg类型时看起来有这种奇怪的行为SQLite rawQuery selectionArgs and Integers Fields。在比较之前,我们已经习惯了Oracle,mysql或者他们投射到较高类型的提供者/语言。看起来SQLite比较结果为false而不是运行时或编译时所需的castexception或强制转换。
因此,当int = str
成为条件的一部分时,没有结果。
不错的发现。