【问题标题】:Detect if Room Destructive Migration is Performed检测是否执行了房间破坏性迁移
【发布时间】:2020-11-16 23:52:12
【问题描述】:

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

Room.databaseBuilder(applicationContext, MyDb::class.java, "database-name")
        .fallbackToDestructiveMigration()
        .build()

有没有办法确定破坏性迁移是否被触发与迁移是否成功完成?我希望能够记录一些信息以进行跟踪。

【问题讨论】:

  • addCallback(myCallback) 应该被召唤到新的创造吧?
  • 是的,看起来Callback 上有一个onDestructiveMigration 回调方法。如果你把它写成完整的答案,我会接受它

标签: android android-room


【解决方案1】:

你可以使用Callbackadd it to your database的房间,它有以下方法:你可以在哪里使用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”);
        }

}

【讨论】:

    猜你喜欢
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多