检测是否进行了房间破坏性迁移

kar*_*arl 5 android android-room

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

Room.databaseBuilder(applicationContext, MyDb::class.java, "database-name")
        .fallbackToDestructiveMigration()
        .build()
Run Code Online (Sandbox Code Playgroud)

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

Zai*_*ain 5

您可以使用 RoomCallback并将其添加到您的数据库中,它有以下方法:您可以在哪里使用onDestructiveMigration

\n\n

这是一个示例示例

\n

爪哇:

\n
@Database(entities = {...}, version = 1)\n\npublic abstract class MyDatabase extends RoomDatabase {\n\n    private static final String DATABASE_NAME = "myDatabaseName.db";\n\n    private static volatile MyDatabase INSTANCE;\n\n    public static MyDatabase getDatabase(final Context context) {\n        if (INSTANCE == null) {\n            synchronized (MyDatabase.class) {\n                if (INSTANCE == null) {\n                    // Create database here.\n                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(),\n                                    MyDatabase.class, DATABASE_NAME)\n                            .fallbackToDestructiveMigration()\n                            .addCallback(mCallback) // Trigger the callback\n                            .build();\n                }\n            }\n        }\n        return INSTANCE;\n    }\n\n\n    /*\n     * Callback when database is created & when it\xe2\x80\x99s opened\n     * */\n    static RoomDatabase.Callback mCallback = new Callback() {\n\n\n         /*\n         * Callback when database is first-time created or recreated after destruction\n         * */\n        @Override\n        public void onCreate(@NonNull SupportSQLiteDatabase db) { // \n            super.onCreate(db);\n            Log.i("LOG_TAG", "Database is created");\n        }\n\n        /*\n         * callback when the database is opened\n         * */\n        @Override\n        public void onOpen(@NonNull SupportSQLiteDatabase db) { \n            super.onOpen(db);\n            Log.i("LOG_TAG", "Database is opened");\n        }\n\n        /*\n         * Called after the database was destructively migrated\n         * */\n        @Override\n        public void onDestructiveMigration(@NonNull SupportSQLiteDatabase db) {\n            super.onDestructiveMigration(db);\n            Log.i("LOG_TAG", "Database is destructed");\n        }\n    };\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

科特林:

\n
@Database(entities = [...], version = 1)\nabstract class MyDatabase : RoomDatabase() {\n\n    companion object {\n\n        private const val DATABASE_NAME = "myDatabaseName.db"\n        private var INSTANCE: MyDatabase? = null\n\n        fun getInstance(context: Context): MyDatabase {\n            return INSTANCE ?: synchronized(this) {\n                val instance = Room.databaseBuilder(\n                    context,\n                    MyDatabase::class.java,\n                    DATABASE_NAME\n                ).fallbackToDestructiveMigration()\n                    .addCallback(mCallback) // Trigger the callback\n                    .build()\n                INSTANCE = instance\n                instance\n            }\n        }\n\n        /*\n         * Callback when database is created & when it\xe2\x80\x99s opened\n         * */\n        var mCallback: Callback = object : Callback() {\n        \n             /*\n             * Callback when database is first-time created or recreated after destruction\n             * */       \n            override fun onCreate(db: SupportSQLiteDatabase) {\n                super.onCreate(db)\n                Log.i("LOG_TAG", "Database is created")\n            }\n            \n            /*\n             * callback when the database is opened\n             * */\n            override fun onOpen(db: SupportSQLiteDatabase) {  \n                super.onOpen(db)\n                Log.i("LOG_TAG", "Database is opened")\n            }\n\n            /*\n             * Called after the database was destructively migrated\n             * */\n            override fun onDestructiveMigration(db: SupportSQLiteDatabase) {\n                super.onDestructiveMigration(db)\n                Log.i("LOG_TAG", "Database is destructed")\n            }\n            \n        }\n    }\n    \n}\n
Run Code Online (Sandbox Code Playgroud)\n