Android 2.1 和 2.2 之间的 SQLite 差异
Posted
技术标签:
【中文标题】Android 2.1 和 2.2 之间的 SQLite 差异【英文标题】:SQLite differences between Android 2.1 and 2.2 【发布时间】:2011-08-28 08:39:30 【问题描述】:我有一个 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 上运行良好。
因此,我的假设是 SQLite 在 Android 2.1 和 2.2 之间发生了一些变化。 This answer 提供了每个 Android API 级别附带的 SQLite 版本。它说 SQLite 在 2.1 和 2.2 之间从 3.5.9 更新到 3.6.22。查看the SQLite release history,我没有看到任何可以解释差异的特别明显的东西。
任何人都可以准确地确定发生了什么变化,并建议我如何解决它,以便我的代码可以在 Froyo 之前的设备上运行吗?
【问题讨论】:
我只是想确保您没有明显跳过。在尝试之前,您是否在模拟器/设备上“清理过数据”?也许您的开发版本较旧,并且该视图在该模拟器/设备上没有列? @katit 是的,完全干净。我专门创建了新的空 AVD 来测试它。 【参考方案1】:我在使用 DISTINCT 时遇到了 SQLite 的问题,这可能与使用 SUM 时遇到的问题相同。
在使用 DISTINCT 时的早期操作系统版本中,我必须为列名设置别名,否则逻辑将失败并出现类似的错误(如果不完全相同)(我不记得确切的错误是什么),但我猜他们已修复它在以后的操作系统版本中。
例子
SELECT DISTINCT _id AS _id, test AS test FROM table
适用于所有操作系统版本,同时
SELECT DISTINCT _id, test FROM table
对于早期的操作系统会失败
【讨论】:
我有一个支持 v2.1 及更高版本的应用程序。我在应用程序中添加了一个视图,它是联合查询的组合。该视图在 v2.2 及更高版本中运行良好,但在 v2.1 中运行良好。在每个子查询中,我为每一列设置了别名,这使得视图可以在 v2.1 中工作。感谢您的建议....效果很好!【参考方案2】:我的应用程序中存在完全相同的问题。共同点是我也使用视图并且有外键。
我已经从模拟器下载了我的数据库。在 Android OS 2.1 之外运行查询没有问题。
试一试 mp2526 的答案,但使用“columnx AS columnx”进行查询没有任何区别。我会尝试隔离问题。
【讨论】:
如果我在独立视图中运行相同的查询,它工作正常。也许这已经很明显了,但在高水平上,Views 和 Android 2.1 的组合表现不佳。 我同意,我最终解决了我的问题,通过重建查询以避免视图。 是的,我最后也是这样解决的。我想这没什么大不了的,但在数据库中管理视图感觉更容易。我将错误追溯到查询的本机平台实现。这足以让我决定在 Java 中追求某种神奇的 API 调用是不值得的。 mp2526 的回答非常适合我的观点,这是一堆包含表的左外连接的查询联合。我强烈建议查看“mp2526”的答案来解决这个问题。【参考方案3】:刚刚遇到同样的问题。当我使用 Column AS Column 符号重新进行视图声明时,它确实有效。
【讨论】:
【参考方案4】:问题在于 Android 2.1 会返回列及其表名,因此查询类似于
SELECT id FROM table
将返回一列名称为table.id
正如已经指出的那样,解决方案是写
SELECT id as id FROM table
【讨论】:
您的陈述不够清楚,似乎不是答案。请仅使用 SO 答案发布答案,否则评论现有答案。另请查看help
菜单下的tour
。
如您所说,解决方案已经提供,无需重新回答。以上是关于Android 2.1 和 2.2 之间的 SQLite 差异的主要内容,如果未能解决你的问题,请参考以下文章
Android ListView Edge Fading 适用于 2.2 虚拟设备,但不适用于三星 2.2.1