android - 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
?
解决方案
由于平台和@DatabaseView
房间注释用例,这种行为是有意的。
注释的主要目标是class
. 默认名称 of@DatabaseView
是该类的名称。Room 不能禁止您创建具有相同名称的类,因为这不是它的职责范围(而且几乎不可能)。
现在让我们想象它IF NOT EXISTS
存在于视图创建查询中。我们有两个同名的类来定义房间视图。我们无法控制何时创建哪个视图,因此我们不知道我们的数据库中将以特定名称拥有哪个视图,因为不会有任何关于视图覆盖的警告。如果存在这种行为,那将非常容易出错且令人困惑。
我们可以为视图定义自定义名称,但它可能与其他已经存在的视图的类名相同,这将导致相同的问题。
在创建表时,我们有这个IF NOT EXISTS
子句,因为我们可以控制命名、创建和链接这个表到我们的数据库。对于表,我们显式地执行它,而对于视图,我们隐式地执行此操作。
请记住,Room 仅实现了 SQLite 函数的有限子集。要更好地控制您想要实现的目标 - 直接使用 SQLite。
我相信,在我的回答中,上述问题是 SQLite 视图的 Room 实现这种行为的主要原因。请记住,将来某些事情可能会发生变化,因此这个答案可能仅在一段时间内相关。
希望能帮助到你。
推荐阅读
- git - 将新存储库中的 git 历史记录附加到旧存储库
- php - PHP中日期时间和枚举的数据类型是什么?
- mysql - stamps.com软件17.7版本mysql ODBC连接器导入顺序有错误
- xamarin - 仅在 xamarin 形式的标题中滑动手势
- outlook - 是否可以在 OWA 的“轻松访问”加载项工具栏中添加加载项图标?
- python-3.x - 有类时从 tkinter Python 表单获取输入变量
- python - Python:如何将除数分类为合数和素数?
- php - 为什么我的 Stripe Webhook 功能不起作用(测试模式)?
- flutter - 从 API 获取多个页面并添加到流接收器
- android - 颤振滑块(activeTrackHeight 和 inactiveTrackHeight)