在Android上使用Room for sqlite库时,我注意到虽然数据库的第一个版本的表是自动创建的,但我只看到了如何通过手动编写Migration-classes的sql命令来迁移到较新版本的教程。
这似乎真的很奇怪,因为可以自动生成这些迁移(例如,像django),令人惊讶的是,V1的创建命令是自动生成的,但如果我稍后添加一个表,我必须手动输入命令。
那么,我只是错过了它,还是我真的必须编写迁移?
发布于 2019-08-12 09:51:25
根据我的经验,你必须手动为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();您将手动管理数据库迁移,并负责所有数据。例如,您向User表添加了一个新的属性/列,您将必须创建一个迁移,即alter the user table,并添加默认值为blah blah的新属性。
我还给出了一些建议,如果你要做迁移,要小心,否则它会让你头疼,你的应用程序会产生与迁移相关的崩溃。
发布于 2019-08-12 04:03:48
发布于 2021-10-30 09:43:11
现在从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
https://stackoverflow.com/questions/57453096
复制相似问题