【问题标题】:Funny(Glitchy) behaviour querying content resolver有趣(故障)行为查询内容解析器
【发布时间】:2015-03-17 17:28:18
【问题描述】:

我正在尝试使用 androids 电话内容提供商进行一个小型实验,所以我在我的主要活动中编写了这段代码,以按 _id 降序排列 40 行 然后使用最后一行 id 在另一个具有 _id 的游标中再获取 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 的有效游标

谁能帮我找出问题所在?

【问题讨论】:

    标签: android sqlite android-contentresolver


    【解决方案1】:

    在查询方法的 API 中,他们说参数是bound as String。在结果查询中,它们将显示为 '653',即使您可能认为它们应该显示为 653

    SQLite 或 Java 接口在比较不同的 arg 类型时看起来有那种奇怪的行为SQLite rawQuery selectionArgs and Integers Fields。在比较之前,我们习惯于 Oracle、mysql 或它们转换为上层类型的任何提供程序/语言。看起来 SQLite 比较结果为 false 而不是 castexception 或在运行时或编译时需要强制转换。

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

    不过很好的发现。

    【讨论】:

      猜你喜欢
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      相关资源
      最近更新 更多