Android-Room 可以自动创建迁移吗?

Posted

技术标签:

【中文标题】Android-Room 可以自动创建迁移吗?【英文标题】:Can Android-Room auto-create migrations? 【发布时间】:2019-12-18 13:19:57 【问题描述】:

android 上使用 Room for sqlite 库时,我注意到虽然数据库的第一个版本的表是自动创建的,但我只看到了有关如何通过手动编写 sql 命令迁移到新版本的教程迁移类。

这看起来真的很奇怪,因为可以自动生成这些迁移(例如 django),令人惊讶的是 V1 的创建命令是自动生成的,但是如果我稍后添加一个表,我必须手动输入命令.

那么我只是错过了它还是我真的必须编写迁移?

【问题讨论】:

This 可能会有所帮助 【参考方案1】:

目前,使用 Room,您确实必须编写迁移。

【讨论】:

你知道为什么这个(恕我直言)特性没有实现吗? @FooTheBar:如果我不得不猜测,他们还没有解决这个问题。【参考方案2】:

不可以,您必须编写 Room 迁移。

选中此tutorial 以编写迁移。

我注意到房间没有良好的迁移系统

【讨论】:

【参考方案3】:

根据我的经验,您必须手动为 Google Room 创建迁移。也许您要迁移的原因之一是保存/处理安全保存在 SQLite 数据库中的数据。

例如,您进行破坏性迁移:

Room.databaseBuilder(context.getApplicationContext(),
                    UsersDatabase.class, "Sample.db")
            .fallbackToDestructiveMigration()
            .build();

这将尝试删除您的数据库,将重新创建您的架构,并且您的数据也将消失。

所以对于迁移来说,就像

Room.databaseBuilder(context.getApplicationContext(),
    UsersDatabase.class, "Sample.db")
    .addMigrations(MIGRATION_1_2)
    .build();

您正在手动管理数据库迁移,并且您将对所有数据负责。例如,您向用户表添加了一个新属性/列,您必须为更改用户表创建迁移并添加默认值为 blah blah blah...的新属性...

我也给一些建议,如果你要进行迁移,请谨慎操作,否则会让你头疼,并且你的应用会产生迁移相关的崩溃。

【讨论】:

【参考方案4】:

从 2.4.0 版本开始支持自动迁移

https://developer.android.com/reference/androidx/room/AutoMigration

【讨论】:

【参考方案5】:

现在从房间2.4.0支持。

目前仅提供测试版2.4.0-beta01。我已经在我的项目中测试了它的工作正常。

// Database class before the version update.
@Database(
  version = 1,
  entities = User.class
)
public abstract class AppDatabase extends RoomDatabase 
  ...


// Database class after the version update.
@Database(
  version = 2,
  entities = User.class,
  autoMigrations = 
    @AutoMigration (from = 1, to = 2)
  
)
public abstract class AppDatabase extends RoomDatabase 
  ...

见doc

【讨论】:

以上是关于Android-Room 可以自动创建迁移吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 Xcode 7 创建自动扩展应用程序吗?

Android Room 自动迁移

自动伪造 Django 迁移

使用sequelize时如何自动创建迁移文件?

如果我已经发布的 v1 没有版本化的 Core Data 模型,我可以使用“自动轻量级迁移”吗?

MagicalRecord 不应该自动迁移新属性吗?