我有一个 Android 应用程序,到目前为止我的所有测试都是在我的 Froyo 手机上进行的。我刚刚开始在模拟器中针对 1.6 和 2.1 进行测试,它在启动时崩溃了。它在我的一个 View 中找不到列。
05-17 23:31:31.446: ERROR/AndroidRuntime(198): Caused by:
android.database.sqlite.SQLiteException: no such column:
categoryTable.currentBal: , while compiling:
SELECT SUM(categoryTable.currentBal) FROM catDisplayTable
WHERE masterCategoryName != "__Hidden__"
View 的架构如下:
CREATE VIEW catDisplayTable AS SELECT categoryTable._id, categoryTable.name,
categoryTable.currentBal, categoryTable.sequence, categoryTable.note,
masterCategoryTable.name AS masterCategoryName FROM categoryTable
LEFT OUTER JOIN masterCategoryTable
ON categoryTable.masterCategoryId = masterCategoryTable._id;
通过 adb shell
连接到各种模拟器实例,我已经确认 (1) 在所有情况下都存在正确的模式,并且 (2) 在 1.6 和 2.1 中,SQLite 只是无法定位此 View 中的列,即使是像
SELECT categoryTable.name FROM catDisplayTable;
或
SELECT name FROM catDisplayTable;
它在 2.2 上运行良好。
因此,我的推测是在 Android 2.1 和 2.2 之间的 SQLite 中发生了一些变化。 This answer有助于提供每个 Android API 级别附带的 SQLite 版本。它说 SQLite 在 2.1 和 2.2 之间从 3.5.9 更新到 3.6.22。看着the SQLite release history ,我没有看到任何可以解释差异的特别明显的东西。
任何人都可以准确地确定发生了什么变化,并建议我如何解决它以便我的代码在 Froyo 之前的设备上运行吗?
最佳答案
我在使用 DISTINCT 时遇到了 SQLite 的问题,这可能与您在使用 SUM 时遇到的问题相同。
在较早的操作系统版本中,当使用 DISTINCT 时,我必须为列名添加别名,否则逻辑将失败并出现类似的错误(如果不完全相同的话)(我不记得确切的错误是什么),但我猜他们修复了它在更高版本的操作系统中。
例子
SELECT DISTINCT _id AS _id, test AS test FROM table
适用于所有操作系统版本,同时
SELECT DISTINCT _id, test FROM table
对于早期的操作系统会失败
关于android - Android 2.1 和 2.2 之间的 SQLite 差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6050267/