【问题标题】:Android Room persistence library. Alter Database View in migrationAndroid Room 持久性库。在迁移中更改数据库视图
【发布时间】:2021-09-06 07:01:28
【问题描述】:

我在我的 android 项目中使用 Room 持久性库。我有一个数据库视图,我想在我的应用程序的新版本中添加一列。什么是正确的迁移代码?

database.execSQL("????")

PS:我想更改视图,而不是表格,我尝试了这个:

database.execSQL("ALTER TABLE table_name ADD COLUMN column_name data_type")

我收到此错误:无法向视图添加列(代码 1 SQLITE_ERROR)

更新:我的旧版观点:

@Data
@DatabaseView("SELECT 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 " 
)
public class SiteDetail {
    long memberId;
    String address;
    String groupName;
}

新版本:

@Data
@DatabaseView("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 " 
)
public class SiteDetail {
    long id;
    long memberId;
    String address;
    String groupName;
}

可以看出,我想将 id 列添加到我的数据库视图中。

【问题讨论】:

    标签: android migration android-room


    【解决方案1】:

    在 SQLite 3.25.0 版之前(Android API 30 以下的任何版本)视图不会根据表更改而更改,按照

    兼容性说明:重命名表时 ALTER TABLE 的行为在版本 3.25.0 (2018-09-15) 和 3.26.0 (2018-12-01) 中得到增强,以便将重命名操作向前推进到触发器中以及引用重命名表的视图。

    如果任何视图以受架构更改影响的方式引用表 X,则使用 DROP VIEW 删除这些视图,然后使用 CREATE VIEW 进行必要的更改以适应架构更改。

    在您的迁移中,您需要 DROP 视图(在 ALTER TABLE 之前)然后创建视图 (创建视图的 SQL 可以在成功编译项目后从生成的 Java 中获取) , 如果 API 小于 30(或无关)。

    【讨论】:

    • 我按照您的指导完成了迁移,没有任何问题,谢谢。
    【解决方案2】:

    您可以使用 alter query 添加新列,例如

    database.execSQL("ALTER TABLE table_name ADD column_name datatype")
    

    【讨论】:

    • 感谢您的回答,但我收到此错误:无法将列添加到视图(代码 1 SQLITE_ERROR)
    • 如果您要添加数据类型为整数的列,请尝试在 INTEGER NOT NULL DEFAULT 0@AlirezABarakati 等数据类型后添加默认值
    • 我遇到了同样的错误:无法将列添加到视图(代码 1 SQLITE_ERROR):,ALTER TABLE SiteDetail ADD COLUMN id INTEGER NOT NULL DEFAULT 0
    • 用实体更新您的问题并提及您要添加的列
    • 尝试将 id type long 赋予 int
    【解决方案3】:

    首先创建迁移对象如下

    val MigrationFrom1To2 = object : Migration(1, 2) {
        override fun migrate(database: SupportSQLiteDatabase) {
            database.execSQL("ALTER TABLE your_table_name ADD COLUMN your_column_name data_type")
        }
    }
    

    在此之后,在您的数据库配置中添加上述对象

    Room.databaseBuilder(
        applicationContext, 
        MyAppDatabase::class.java, 
        "your_database_name"
    ).addMigrations(MigrationFrom1To2)
    .build()
    

    【讨论】:

    • 我试过了,但我得到了这个错误:无法将列添加到视图(代码 1 SQLITE_ERROR)
    猜你喜欢
    • 2019-08-09
    • 2018-11-11
    • 2012-05-28
    • 2020-03-22
    • 2020-04-05
    • 2019-11-25
    • 2021-06-04
    • 1970-01-01
    • 2019-04-25
    相关资源
    最近更新 更多