【问题标题】:Android 2.2 (Froyo) SQLite missing some IN clause functionality?Android 2.2 (Froyo) SQLite 缺少一些 IN 子句功能?
【发布时间】:2026-01-17 20:05:02
【问题描述】:

最近我将我的 Nexus One 更新为 Froyo (2.2),我注意到 SQLite 的一些明显不同的行为。

例如,我一直在使用子查询(返回字符串数据)作为 IN 子句的一部分,而子查询部分似乎不再正常运行。我在下面附上了一个使用联系人数据库的示例 SQL 查询(直接查询仅用于说明目的):

SELECT _id FROM data WHERE display_name IN (SELECT display_name FROM contacts);

在 Android 2.1 之前,这不是问题。然而,在更新之后,这将返回一个空记录集,除非我单独运行子查询,将每个结果值括在单引号中并将这些值直接附加到 IN 子句中。

我注意到我正在处理的多个应用程序中的这种功能损失,但我应该注意,当结果是数字而不是基于字符串时,它似乎确实有效。

还有其他人遇到过这个问题吗?

【问题讨论】:

    标签: android sqlite android-2.2-froyo in-clause


    【解决方案1】:

    如果 SQLite 的行为确实发生了变化,您可以尝试改用 EXISTS 运算符重写查询:

    SELECT _id FROM data WHERE EXISTS
        (SELECT * FROM contacts WHERE contacts.display_name = data.display_name)
    

    这消除了对IN 运算符的依赖。

    【讨论】:

    • 谢谢,这看起来很有用!不幸的是,我将不得不更改子查询,因为 android 的合并代码已经改变了 display_name 的生成方式。不过,这应该对我的其他项目有所帮助:)