android - Android 2.1 和 2.2 之间的 SQLite 差异

标签 android sqlite

我有一个 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/

相关文章:

Android 低功耗蓝牙 - iBeacon

java - (Android) Java 从 SQLDatabase 获取值

使用 COALESCE 和 LEFT OUTER JOIN 的 SQL 查询

java - 如何从数据库中获取距当前时间最快的值?

ios - 如何将已填充的 SQLite 数据库与 SharkORM 结合使用

android - Xamarin.Forms:如何使用 DPI 和权重

android - 如何将 Jar 文件添加到 Android 的 Cordova 插件而不将其编译到 APK 中

java - 为什么我将 ArrayList 转换为 Integer[] 是错误的?

android - 将数据库中的特定列检索到 Spinner

android - 如何将我的 Android 应用程序限制为非平板电脑?