【问题标题】:SQLite query no longer works in Android 5.0SQLite 查询不再适用于 Android 5.0
【发布时间】:2015-08-03 22:34:05
【问题描述】:

我在我的应用中添加了一些额外的搜索功能 - 经过测试并且在 Android 4.4.2 上运行良好。

刚刚将我的设备更新到 5.0,但这个新的搜索功能不起作用,返回一个空光标。 (应用程序中的其他查询在所有设备上都可以正常工作,表明这是代码问题而不是数据问题。)

我了解,从 Android 4.4.2 到 Android 5.0,SQLite 从 3.7.11 更新到 3.8.0,我预计这就是导致此问题的原因。我查看了changelog for SQLite 3.8.0 并没有什么明显值得关注的地方(无论如何,对于我未经训练的人来说)。

这是我的代码生成的相关查询:

SELECT
    statuses.status AS status,
    shelves.shelf_name AS shelf_name, 
    aisles.aisle_name AS aisle_name, 
    products.image_file_name_stored AS image_file_name_stored, 
    parent_companies.url AS url, 
    parent_companies.email AS email, 
    products.buy_url AS buy_url, 
    products_data.status_id AS status_id, 
    parent_companies.company_name AS company_name, 
    products.image_file_name AS image_file_name, 
    '(' || shelves.shelf_name || ')' AS suggest_text_2, 
    products._id AS suggest_intent_data_id, 
    products.product_name AS suggest_text_1, 
    parent_companies.tel AS tel, 
    products.product_name AS product_name, 
    products_data.notes AS notes, 
    products.priority AS priority, 
    products._id AS _id, 
    products_data.last_modified_on AS last_modified_on 

FROM 
    products

INNER JOIN 
    parent_companies ON products.parent_company_id = parent_companies._id

INNER JOIN 
    shelves ON products.shelf_id = shelves._id

INNER JOIN
    aisles ON shelves.aisle_id = aisles._id

INNER JOIN 
    products_data ON products._id = products_data.product_id

INNER JOIN
    statuses ON products_data.status_id = statuses._id

WHERE 
    (shelves._id = ?)

ORDER BY
    shelf_name ASC

还有我的selectionArgs = {"156"}

更新

现在,为了测试,我将selection 字符串设置为null,将selectionArgs 字符串[] 设置为null光标现在充满了结果 -太多了,当然,因为不再有 WHERE 条件。

所以,我的问题最终是这个......为什么有以下选择标准会在 Android 4.4.2 (SQLite 3.7.11) 中产生结果,但在 Android 5.0 (SQLite 3.8.0) 中没有结果?...

String selection = "shelves._id = ?";
String[] selectionArgs = {"156"};

...肯定不是我想将 integer 列 (_id) 与 String ("156") 进行比较?!

更新 #2

使用有问题的查询,我已经使用调试器介入,在 SQLiteQueryBuilder.java 的第 393 行,sql String 是...

"选择 statuses.status AS 状态,shelf.shelf_name ASshelf_name, aisles.aisle_name AS aisle_name, products.image_file_name_stored AS image_file_name_stored, parent_companies.url AS url, parent_companies.email 作为电子邮件,products.buy_url 作为buy_url, products_data.status_id AS status_id, parent_companies.company_name AS company_name, products.image_file_name AS image_file_name, '(' || 货架.shelf_name || ')' ASSuggest_text_2,products._id AS Suggest_intent_data_id,products.product_name ASSuggest_text_1, parent_companies.tel AS 电话,products.product_name AS product_name, products_data.notes AS 注释, products.priority AS 优先级, products._id AS _id, products_data.last_modified_on AS last_modified_on FROM products INNER JOIN parent_companies ON products.parent_company_id = parent_companies._id INNER JOIN 货架 ON products.shelf_id =shelfs._id INNER JOIN aisles ON shelf.aisle_id = aisles._id INNER JOIN products_data ON products._id = products_data._id INNER JOIN statuses ON products_data.status_id = statuses._id WHERE (shelves._id = ?) ORDER BY Shelf_name ASC"

...看起来不错。我继续调试调试器,看看哪里出错了,但是当我进入db.rawQueryWithFactory() 方法时,调试器似乎迷路了(它把我带到了注释行),所以我不确定是什么实际问题可能是。

【问题讨论】:

  • "光标现在满是结果"——但是其中有 156 个 shelves._id 的那个?如果不是,那就是数据问题。
  • 没有理由让编写的查询在 4.4.2 上工作但在 5.0 上工作。要么你有数据问题,要么查询数据库的代码有问题。
  • 见我的回答,下面。也许我发现了一个错误。我的数据和代码很好。使上述查询与我的应用程序中在 Android 4.4.2 和 Android 5.0 上运行良好的其他查询不同的唯一原因是 selection / selectionArgs 值。
  • 如果从WHERE 子句中删除(parentheses) 会有什么不同吗?
  • 谢谢,格雷厄姆,但括号是由 Android 添加的。我只是在使用String selection = "shelves._id = ?";

标签: android sqlite android-sqlite android-5.0-lollipop


【解决方案1】:

我的猜测是正确的。我刚刚尝试了这段代码来修改selectionselectionArgs,现在一切都按预期工作了:

        if (selection != null && selectionArgs != null && selectionArgs.length == 1 && isNumeric(selectionArgs[0])) {
            selection = selection.replace("?", selectionArgs[0]); // e.g., changes "shelves._id = ?" to "shelves._id = 156"
            selectionArgs = null; // e.g., changes {"156"} to null
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-14
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多