Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 有趣(Glitchy)行为查询内容解析器_Android_Sqlite_Android Contentresolver - Fatal编程技术网

Android 有趣(Glitchy)行为查询内容解析器

Android 有趣(Glitchy)行为查询内容解析器,android,sqlite,android-contentresolver,Android,Sqlite,Android Contentresolver,我尝试了一个关于androids电话内容提供商的小实验,所以我在我的主要活动中编写了这段代码,以按id降序获得40行 然后使用最后一行id在另一个游标中再获得20行,该游标的_id

我尝试了一个关于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");