2011-05-18 69 views
8

我有一个Android应用程序,到目前为止我所有的测试都在我的Froyo手机上。我刚开始在模拟器中对1.6和2.1进行测试,并且在启动时崩溃。它在我的一个观点中找不到一列。Android 2.1和2.2之间的SQLite差异

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罚款。

因此我推测SQLite在Android 2.1和2.2之间有所改变。 This answer有用地给出了每个Android API级别附带的SQLite版本。它说SQLite从3.5.9更新到3.6.22在2.1和2.2之间。看看the SQLite release history,我没有看到任何特别明显的可能解释不同之处的东西。

谁能确切地知道已经改变,并建议我怎么能解决它,所以我的代码工作的Froyo之前的设备?

+0

我只是试图确保你没有跳过明显。在尝试之前,您是否在模拟器/设备上“清除数据”?也许你有旧的版本,这个视图没有在那个模拟器/设备上的列? – katit 2011-05-18 20:53:20

+0

@katit是的,完全干净。我专门创建了新的空AVD来测试它。 – 2011-05-18 21:06:23

回答

2

我在我的应用程序完全相同的问题。共同点是我也使用Views和外键。

我已经从模拟器下载了我的数据库。在Android OS 2.1之外运行查询没有任何问题。

都给mp2526的回答一展身手,但与“columnx AS columnx”查询没有区别。我会尝试隔离问题。

+0

如果我运行与视图独立相同的查询,它可以正常工作。也许这已经很明显了,但是从高层面来看,Views和Android 2.1的结合并不好。 – Magnus 2011-05-26 21:00:36

+0

我同意,我最终通过重建我的查询来避免视图来解决我的问题。 – 2011-05-28 08:06:59

+0

是的,我最终也是这样解决它的。我想这不是什么大不了的事情,但在数据库中管理视图更容易。我将错误追溯到查询的本地平台实现。这足以让我决定在Java中进行某种神奇的API调用是不值得的。 – Magnus 2011-06-07 14:08:01

7

我在使用DISTINCT时遇到了与SQLite有关的问题,这可能与使用SUM运行的问题相同。

在早期的操作系统版本,当使用DISTINCT时,我不得不别名列名或逻辑将失败,如果不完全相同的错误(我不记得确切的错误是什么),但我猜他们修复它在以后的操作系统版本。

例如

SELECT DISTINCT _id AS _id, test AS test FROM table 

适用于所有操作系统版本而

SELECT DISTINCT _id, test FROM table 

会失败之前的操作系统

+0

我有一个支持v2.1及以上版本的应用程序。我已经为应用程序添加了一个视图,该视图是加入查询的联合的组合。该视图在v2.2及更高版本中运行良好,但不在v2.1中运行。在每个子查询中,我为每列添加了别名,并允许视图在v2.1中运行。感谢您的建议....它工作得很好! – 2012-10-14 17:45:41

0

刚刚遇到同样的问题。当我使用Column AS Column符号重新查看声明时,它会工作。

0

问题在于Android 2。1返回列与他们以及表名,所以像

SELECT id FROM table 

查询将返回一列名称为table.id

的解决方案,如已经指出的,是写

SELECT id as id FROM table 
+0

你的陈述不够清楚,似乎不是一个答案。请仅使用SO答案发布答案​​,否则对现有答案进行评论。请在'help'菜单下查看我们的'tour'。 – Alexey 2014-07-22 21:03:48

+0

正如你所说,解决方案已经提供,不需要做出新的答案。 – djv 2014-07-22 21:04:06

+0

#rvighne - 谢谢你的伴侣 – user3866289 2014-07-22 21:24:01