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

时间:2015-03-17 09:05:59

标签: android sqlite android-contentresolver

我正在尝试使用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的有效游标

任何人都可以帮我解决问题所在吗?

1 个答案:

答案 0 :(得分:2)

在查询方法的API中,他们说参数将是bound as String。在生成的查询中,即使您认为它们应显示为'653',它们也会显示为653

SQLite或Java接口在比较不同的arg类型时看起来有这种奇怪的行为SQLite rawQuery selectionArgs and Integers Fields。在比较之前,我们已经习惯了Oracle,mysql或者他们投射到较高类型的提供者/语言。看起来SQLite比较结果为false而不是运行时或编译时所需的castexception或强制转换。

因此,当int = str成为条件的一部分时,没有结果。

不错的发现。