【发布时间】:2010-01-01 19:02:49
【问题描述】:
我的一个 android 应用程序执行以下特定 SQLite 查询:
SELECT _id, hourMin, actions FROM profiles
WHERE type=2 AND hourMin > -1 AND days & 8 != 0 AND prof_id >> 16 IN (256)
ORDER BY hourMin ASC LIMIT 1
现在它可以在某些 Android 手机上运行,但在其中一些手机上它会崩溃并出现以下错误:
android.database.sqlite.SQLiteException: no such column: -1: , while
compiling: SELECT _id, hourMin, actions FROM profiles WHERE type=2 AND
hourMin > -1 AND days & 8 != 0 AND prof_id >> 16 IN (256) ORDER BY hourMin
ASC LIMIT 1
由于某种原因,“-1”被解释为一列而不是一个数字......这没有多大意义,当我阅读 SQLite 查询语言时,我认为没有必要在括号中转义这个数字。这可能是不同版本的 SQLite 的问题吗?添加括号会有所帮助吗?相反,我可能会使用 >= 0 重写它,但我仍然想了解发生了什么。
【问题讨论】:
-
尝试用括号括起来,看看是否有帮助。这可能是语句中的分组问题或其他问题。如果我是你,我会计算出每部手机上的 sqlite 版本号,以便你进行比较。
-
是的,我会这样做,但这是随机拍摄。我喜欢了解我的修复 :-) 不幸的是,我从用户那里收到了一些报告,我自己无法使用手机。实际上,用户甚至很难猜出他们的手机使用的是哪个 SQLite 版本。真的不能要求他们在手机上设置 ADB,在桌面上安装 SDK,通过 USB 连接手机并运行一些神秘的命令行...... :-)
-
我什至不知道哪些版本的 SQLite 甚至可能在 Android 上运行,所以我不会冒险将其视为评论。但我从更改日志中看到,位运算符并不总是存在。如果解析器无法识别语句中的位运算符,则很容易想象该特定错误。此外,~ 的优先级在 3.5.3 中是固定的。同样,我不知道,但我可以想象带有 ~ 的优先级错误也会与否定一起存在(不太可能但并非完全不可能)。
-
我也没有这样的列异常,即使该列显然确实存在。事实证明,Froyo 不喜欢没有数据的列,所以我只是在字段中添加了一个“1”作为虚拟对象,并且它起作用了。也许这会对某人有所帮助