Android Room迁移时修改Database View新增列的正确实现方法
Room Database View 新增字段迁移方案
报错原因
你遇到的Cannot add a column to a view (code 1 SQLITE_ERROR)报错,是因为SQLite 不支持使用ALTER TABLE语句修改视图结构,视图本质是基于物理表查询生成的虚拟映射,无法像普通物理表一样直接新增列。
正确迁移代码
修改视图的标准逻辑是先删除旧版本视图,再用新的查询语句创建同名视图。假设你是从数据库版本1升级到版本2,对应Migration写法如下:
static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { // 删除已存在的旧视图 database.execSQL("DROP VIEW IF EXISTS SiteDetail"); // 使用新版本的查询语句创建视图 database.execSQL("CREATE VIEW SiteDetail AS " + "SELECT site.id as id, site.name AS address, group_site.name AS groupName, group_site.member_id AS memberId " + "FROM site, group_site " + "INNER JOIN groupsite_join_site " + "ON site.id = groupsite_join_site.site_id AND group_site.id = groupsite_join_site.group_site_id"); } };
之后将该Migration实例添加到你的Room数据库构建配置中即可。
注意事项
- 上述代码中的
CREATE VIEW查询语句必须和你新版本SiteDetail类上@DatabaseView注解中的语句完全一致,否则Room启动时会因为结构校验不匹配抛出异常 - 如果你在
@DatabaseView注解中通过viewName参数自定义了视图名称,需要将代码中的SiteDetail替换为你自定义的名称 - 本次迁移仅需要更新视图定义,不需要修改关联的三个物理表(site、group_site、groupsite_join_site)的结构
内容的提问来源于stack exchange,提问作者Alireza Barakati
相关产品推荐
相关产品推荐

