8

更新数据库版本后,我不清楚如何使用房间。

例如,假设我最初在房间中定义了以下数据库:

@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

4

3 回答 3

9

所以可以说我有一个新的应用程序版本和一个新的数据库版本。我只需要像这样更改 version = 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 更新链接

于 2017-05-30T23:42:06.067 回答
4

我的回答可能会迟到,但它可能会帮助像我这样最近才找到相同问题答案的人。

由于某些原因需要升级数据库版本但不需要调整数据库,就像编辑@Dao 适配器或@Entity 属性一样简单,而不影响数据库的结构。

如果您升级数据库中的版本,如下所示:

从:

@Database(
    entities = [ExampleClass::class],
    version = 1,
    exportSchema = false
)

至:

@Database(
    entities = [ExampleClass::class],
    version = 2,
    exportSchema = false
)

如果您以后不添加任何内容,数据库将被刷新,就像它被删除一样。为避免删除,您可以简单地添加一个空的 Migration,如下所示:

private val MIGRATION_1_2 = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {

    }
}

建立你的数据库:

@Synchronized
private fun buildDatabase(context: Context, databaseName: String): AppDatabase {
    return Room.databaseBuilder(
        context.applicationContext,
        AppDatabase::class.java,
        databaseName
    )
        .addMigrations(MIGRATION_1_2)
        .allowMainThreadQueries()
        .fallbackToDestructiveMigration()
        .build()
}

数据库数据不受影响

于 2019-10-28T03:04:51.877 回答
1

另一种选择:您可以在修改数据库模式后更新数据库版本号,同时如果您不想提供迁移计划并且只是在构建数据库对象时可以使用fallbackToDestructiveMigration()方法应用您想要的更改,但始终建议提供迁移跟踪:

@Provides
@Singleton
fun provideCryptocurrenciesDatabase(app: Application): Database = Room.databaseBuilder(app,
  Database::class.java, "my_db").fallbackToDestructiveMigration().build()
于 2018-02-27T20:18:01.500 回答