android - 检测是否执行了房间破坏性迁移

标签 android android-room

如果我在启用破坏性回退的情况下运行 Room 迁移:

Room.databaseBuilder(applicationContext, MyDb::class.java, "database-name")
        .fallbackToDestructiveMigration()
        .build()
有没有办法确定破坏性迁移是否被触发与迁移是否成功完成?我希望能够记录一些信息以进行跟踪。

最佳答案

您可以使用房间 Callback add it to your database ,它有以下方法:你可以在哪里使用onDestructiveMigration

  • onCreate:首次创建数据库时调用
  • onOpen:打开数据库时触发
  • onDestructiveMigration:在数据库被破坏性迁移后调用

  • 这是一个示例
    @Database(entities = {.....}, version = 1)
    
    public abstract class MyDatabase extends RoomDatabase {
    
        private static final String DATABASE_NAME = “myDatabaseName.db”;
    
        private static final Object LOCK = new Object();
    
        private static volatile MyDatabase instance; 
    
        public static MyDatabase getDatabase(final Context context) {
            if (INSTANCE == null) {
                synchronized (MyDatabase.class) {
                    if (INSTANCE == null) {
                        // Create database here.
                        INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                                MyDatabase.class, DATABASE_NAME)
                                .fallbackToDestructiveMigration()
                                .addCallback(mCallback) // Trigger the callback
                                .build();
                    }
                }
            }
            return INSTANCE;
        }
    
    
        /*
         * Callback when database is created & when it’s opened
         * */
        static RoomDatabase.Callback mCallback = new Callback() {
            @Override
            public void onCreate(@NonNull SupportSQLiteDatabase db) { // Callback when database is first-time created or recreated after destruction  
                super.onCreate(db);
                Log.i("LOG_TAG", “Database is created”);
            }
    
            @Override
            public void onOpen(@NonNull SupportSQLiteDatabase db) { // callback when the activity is opened 
                super.onOpen(db); 
                Log.i("LOG_TAG", “Database is opened”);  
            }
        };
    
    
            @Override
            public void onDestructiveMigration(@NonNull SupportSQLiteDatabase db) { // Called after the database was destructively migrated
                super.onDestructiveMigration(db);
                Log.i(LOG_TAG, “Database is destructed”);
            }
    
    }
    

    关于android - 检测是否执行了房间破坏性迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64828407/

    相关文章:

    android - 从Kotlin Android中的Application变量创建单独的ArrayList

    java - 如何增加最终的整数变量?

    android - 如何正确构造带有继承的房间实体

    android - IONIC 2 引用错误 : firebase is not defined

    Android 后退按钮 - 从 Intent 中丢失信息

    android - 在 Retrofit + RxJava2 + Room 上处理网络错误

    尝试合并两个表时出现 MySql 错误

    android - 如何以及在何处关闭()我的数据库以停止获取 E/SQLiteLog : (283)

    java - Android - 如何访问在 onResume 中的 onCreate 中实例化的 View 对象?

    android - 为什么我必须为数据库中的自动增量列创建一个 setter?