【问题标题】:Versioning Room database版本控制室数据库
【发布时间】:2019-01-31 22:17:52
【问题描述】:

我可能不理解fallbackToDestructiveMigration()

当我更改 Room 版本号时,我希望它像第一次启动时那样清除我的表并重新填充。但它不会在调用我的填充方法的回调中调用“onCreate”。 相反,表格只会被清除。

关于我的数据库:

它使用实时数据。用户永远不能更改数据库。 ID 被手动插入到代码中,因为它们被用作在线数据库的外键。

有没有办法让未来的迁移重新构建整个东西?

【问题讨论】:

    标签: android android-room android-jetpack


    【解决方案1】:

    当您使用fallbackToDestructiveMigration() 时,您的onCreate() 不会被调用,因为您的数据库已经创建。

    但是您可以通过以下方式使用迁移再次重建整个事物:

    Room.databaseBuilder(context, MyDatabase.class, DB_NAME)
    .addMigrations(FROM_1_TO_2)
    .build();
    
    static final Migration FROM_1_TO_2 = new Migration(1, 2) {
        @Override
        public void migrate(final SupportSQLiteDatabase database) {
            database.execSQL("DELETE FROM `table_name`");    //this will empty table
            database.execSQL("YOUR_INSERTION_QUERY");    //insert in loop for multiple insertion
            }
        };
    

    使用上述代码,您可以在更新数据库版本时随时清除并重新填充表。

    【讨论】: