Android 有趣(Glitchy)行为查询内容解析器
我尝试了一个关于androids电话内容提供商的小实验,所以我在我的主要活动中编写了这段代码,以按id降序获得40行 然后使用最后一行id在另一个游标中再获得20行,该游标的_idAndroid 有趣(Glitchy)行为查询内容解析器,android,sqlite,android-contentresolver,Android,Sqlite,Android Contentresolver,我尝试了一个关于androids电话内容提供商的小实验,所以我在我的主要活动中编写了这段代码,以按id降序获得40行 然后使用最后一行id在另一个游标中再获得20行,该游标的_id
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();
Uri=Uri.parse(“content://mms-sms/conversations");
Cursor Cursor=getContentResolver().query(uri,新字符串[]{“\u id”,“ct\u t”},null,null,
“_iddesc limit 40”);
Log.d(标记,“cursor:+String.valueOf(cursor.getCount()));
cursor.moveToLast();
String lastId=String.valueOf(cursor.getInt(0));
Log.d(标记“最后一个光标id:+lastId”);
cursor.close();
Cursor cursor2=getContentResolver().query(uri,新字符串[]{“\u id”,“ct\u t”},“\u id<?”,新字符串[]{lastId},
“_iddesc limit 20”);
Log.d(标记“cursor2:+String.valueOf(cursor2.getCount()));
游标2.moveToLast();
lastId=String.valueOf(cursor2.getInt(0));
Log.d(标记“Last cursor2 id:+lastId”);
游标2.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,新字符串[]{“\u id”,“ct\u t”},“\u id<?”,新字符串[]{lastId},
“_iddesc limit 20”);
与
Cursor cursor2=getContentResolver().query(uri,新字符串[]{“\u id”,“ct\u t”},“\u id<653”,null,
“_iddesc limit 20”);
当653存储在lastId中时,我得到一个计数为20的有效游标
有人能帮我找出问题所在吗?在查询方法的API中,他们说参数将
绑定为字符串。在结果查询中,它们将显示为'653'
,即使您可能认为它们应该显示为653
SQLite或Java接口在比较不同的arg类型时似乎有这种奇怪的行为。我们习惯于使用Oracle、mysql或其他任何提供者/语言,在比较之前将它们转换为更高的类型。看起来SQLite比较结果为false,而不是运行时或编译时所需的castexception或cast
因此,当int=str
是条件的一部分时,没有结果
不过很好的发现
Cursor cursor2 = getContentResolver().query(uri, new String[]{"_id", "ct_t"}, "_id < 653", null,
"_id desc limit 20");