首页 > 解决方案 > Android 房间创建查看错误

问题描述

我当前的 Android 应用程序使用 Room 作为其本地数据库。该应用程序有许多表和一个视图。

我遇到的问题是,有时当我从“scratch”重新安装应用程序时,会出现以下异常:-

2020-04-17 14:20:22.568 20752-20886/org.my.application E/SQLiteLog: (1) table `myView` already exists

我相信这个问题是由 Room 引起的

例如表/索引创建/删除语句如下:-

CREATE TABLE IF NOT EXISTS...
CREATE UNIQUE INDEX IF NOT EXISTS 
DROP TABLE IF EXISTS 

View create 语句在哪里

CREATE VIEW `myView`

为什么不能 Room 生成包含的创建视图语句IF NOT EXISTS

标签: androidandroid-room

解决方案


由于平台和@DatabaseView房间注释用例,这种行为是有意的。

注释的主要目标是class. 默认名称 of@DatabaseView是该类的名称。Room 不能禁止您创建具有相同名称的类,因为这不是它的职责范围(而且几乎不可能)。

现在让我们想象它IF NOT EXISTS存在于视图创建查询中。我们有两个同名的类来定义房间视图。我们无法控制何时创建哪个视图,因此我们不知道我们的数据库中将以特定名称拥有哪个视图,因为不会有任何关于视图覆盖的警告。如果存在这种行为,那将非常容易出错且令人困惑。

我们可以为视图定义自定义名称,但它可能与其他已经存在的视图的类名相同,这将导致相同的问题。

在创建表时,我们有这个IF NOT EXISTS子句,因为我们可以控制命名、创建和链接这个表到我们的数据库。对于表,我们显式地执行它,而对于视图,我们隐式地执行此操作。

请记住,Room 仅实现了 SQLite 函数的有限子集。要更好地控制您想要实现的目标 - 直接使用 SQLite。

我相信,在我的回答中,上述问题是 SQLite 视图的 Room 实现这种行为的主要原因。请记住,将来某些事情可能会发生变化,因此这个答案可能仅在一段时间内相关。

希望能帮助到你。


推荐阅读