我有一个Android应用程序,到目前为止我的所有测试都在我的Froyo手机上。我刚开始在模拟器中对1.6和2.1进行测试,它在启动时崩溃了。它在我的一个视图中找不到列。
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__"
视图的架构如下:
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无法找到列在这种观点中,即使是像
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之前的设备上运行?
答案 0 :(得分:7)
在使用DISTINCT时,我遇到了SQLite的问题,可能与SUM遇到的问题相同。
在使用DISTINCT的早期操作系统版本中,我不得不对列名称进行别名,否则逻辑会失败,如果不是完全相同的错误(我不记得错误是什么),但我猜他们已经修复了它在以后的OS版本中。
例如
SELECT DISTINCT _id AS _id, test AS test FROM table
适用于所有操作系统版本
SELECT DISTINCT _id, test FROM table
对于早期的操作系统会失败
答案 1 :(得分:2)
我的应用程序中存在完全相同的问题。共同点是我也使用Views并拥有外键。
我已从模拟器下载了我的数据库。我在Android OS 2.1之外运行查询没有问题。
给了mp2526一个回答,但查询“columnx AS columnx”并没有什么区别。我会尝试隔离这个问题。
答案 2 :(得分:0)
刚遇到同样的问题。当我使用Column AS Column符号重新进行视图声明时,它可以工作。
答案 3 :(得分:0)
问题是Android 2.1会返回列及其表名,所以像
这样的查询SELECT id FROM table
将返回一个名为table.id
正如已经指出的那样,解决方案是编写
SELECT id as id FROM table