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] 界面的划分

Android ListView Edge Fading 适用于 2.2 虚拟设备,但不适用于三星 2.2.1

Spark-SQL——DataFrame与Dataset

Android :安卓学习笔记之 事件分发机制 的简单理解和使用

IPC 机制

Android 数据库降级怎么处理啊?