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

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 是条件的一部分时,没有结果。

不错的发现。