Android房间创建视图错误



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

我遇到的问题是,当我从"零开始"重新安装应用程序时,偶尔会出现以下异常:-

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

我认为这个问题是由房间引起的

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

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

其中,View create语句是

CREATE VIEW `myView`

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

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

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

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

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

在表创建中,我们有IF NOT EXISTS子句,因为我们拥有有关命名、创建和将该表链接到数据库的所有控制权。对于表,我们显式执行,而对于视图,我们隐式执行。

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

我相信,上面在我的回答中提到的问题是导致Room实现SQLite视图的这种行为的主要原因。请记住,在未来可能会发生一些变化,所以这个答案可能只在一段时间内有效。

希望能有所帮助。

最新更新