Android room persistent library - 如何更改数据库版本

时间:2017-05-30 23:09:06

标签: android android-room

在更新数据库版本后,我不清楚如何使用room

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

@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

3 个答案:

答案 0 :(得分:3)

因此,假设我有一个新的应用程序版本和一个新的数据库版本。我只需要像这样更改版本= 2:

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`))");
    }
};

然后提供这样的迁移政策:

onView(withId(R.id.register_scroll_view))
        .perform(CustomScrollActions.nestedScrollTo, click());

这里的关键是,如果未提供迁移策略,则似乎整个数据库都已重建(因此您的用户将丢失所有以前的数据)。

这是根据提供的@commonsWare更新link

答案 1 :(得分:1)

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

app.use('/proxy', proxy('www.google.com'));

答案 2 :(得分:0)

我的答案可能晚了,但是它可能会帮助像我这样最近才找到同一问题答案的人。

由于某些原因,您需要升级数据库版本,而无需调整数据库,就像编辑@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()
}

数据库数据将不受影响