Android室持久性库 - 如何更改数据库版本
问题描述:
在更新数据库版本后,我不清楚如何使用room。Android室持久性库 - 如何更改数据库版本
例如,可以说,我原本在房间中定义的以下数据库:
@Database(entities = {Event.class}, version = 1)
@TypeConverters(DateTypeConverter.class)
public abstract class EventDatabase extends RoomDatabase {
public abstract EventDao eventDao();
}
,然后我改变的版本,所以它看起来像现在这样:
@Database(entities = {Event.class}, version = 2)
@TypeConverters(DateTypeConverter.class)
public abstract class EventDatabase extends RoomDatabase {
public abstract EventDao eventDao();
}
当我看到更改版本我的意思是我可能已添加或删除数据库中的列,所以它不一样。我的问题如下:
我现在需要维护两个数据库吗? v1和v2?有没有办法将实体轻松复制到v2?在更改版本时,是否足以将其从1更改为2,或者是否必须创建另一个类,例如EventDatabase2?
也在这里是房间里的版本我使用:android.arch.persistence.room:runtime:1.0.0-alpha1
答
所以,可以说,我有一个新的应用程序版本和一个新的数据库版本也。我只需要更改版本= 2这样的:
@Database(entities = {Event.class}, version = 2)
@TypeConverters(DateTypeConverter.class)
public abstract class EventDatabase extends RoomDatabase {
public abstract EventDao eventDao();
}
,然后提供移民政策是这样的:
Room.databaseBuilder(getApplicationContext(), MyDb.class, "database-name")
.addMigrations(MIGRATION_1_2).build();
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("CREATE TABLE `Fruit` (`id` INTEGER, "
+ "`name` TEXT, PRIMARY KEY(`id`))");
}
};
这里的关键是,如果不提供移民政策似乎在整个数据库被重建(所以你的用户会丢失所有以前的数据)。
这是根据@commonsWare更新link提供。
答
另一种选择: 您可以在DB模式进行修改后的更新数据库的版本号,并在同一时间,你可以在你的数据库对象的建设使用fallbackToDestructiveMigration()方法,如果你不想提供迁移计划,只是应用所需的更改,但它总是建议提供迁移跟踪:
@Provides
@Singleton
fun provideCryptocurrenciesDatabase(app: Application): Database = Room.databaseBuilder(app,
Database::class.java, "my_db").fallbackToDestructiveMigration().build()
https://developer.android.com/topic/libraries/architecture/room.html#db -higration – CommonsWare