Android 2.1和2.2之间的SQLite差异

时间:2011-05-18 19:54:58

标签: android sqlite

我有一个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之前的设备上运行?

4 个答案:

答案 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