Я добавил библиотеку базы данных Romm для одного из моих приложений для Android и некоторое время использую ее правильно, но теперь мне нужно обновить приложение и я хочу добавить в него миграцию базы данных.
У меня естьследовал нескольким учебникам, блогам и официальным документам для этого и пытался добавить миграцию.
Однако, когда я пытался добавить миграцию БД, я получал ту же ошибку даже после добавления миграции для нескольких версий, таких как java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: (database path)
Вот код для миграции.
val MIGRATION_4_5: Migration = object : Migration(4, 5) {
override fun migrate(database: SupportSQLiteDatabase) {
// database.execSQL("ALTER TABLE timetracker ADD COLUMN tempId TEXT")
// 1. Create new table
database.execSQL("CREATE TABLE timetrackerTemp (
contentId INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
time INTEGER, tempId TEXT );")
// 2. Copy the data
database.execSQL("INSERT INTO timetrackerTemp (
contentId, time, tempId ) SELECT contentId, time,
tempId FROM timetracker")
// 3. Remove the old table
database.execSQL("DROP TABLE timetracker")
// 4. Change the table name to the correct one
database.execSQL("ALTER TABLE timetrackerTemp RENAME TO timetracker")
}
}
Вот код для получения объекта базы данных,
daoInstance = Room.databaseBuilder(this, AppDatabase::class.java, "myapp.db")
.allowMainThreadQueries()
.addMigrations(AppDatabase.MIGRATION_4_5)
.build()
Если у кого-то есть идеи, пожалуйста, помогите.
CRASH LOGS,
E / AndroidRuntime: FATAL EXCEPTION: main java.lang.RuntimeException: Невозможно приостановить действие {com.example.dev/com.example.content.appview.content.ContentActivity}: java.lang.IllegalStateException: попытка повторно открыть уже закрытый объект: SQLiteDatabase: /data/user/0/com.example.dev/databases/test.db в android.app.ActivityThread.performPauseActivityIfNeeded (ActivityThread.java:3746) в android.app.ActivityThread.performPauseActivity (ActivityThread.java:3712) в android.app.ActivityThread.performPauseActivity (ActivityThread.java:3686) в android.app.ActivityAread.hand(ActivityThread.java:3660) в android.app.ActivityThread.-wrap16 (ActivityThread.java) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1485) в android.os.Handler.dispatchMessage (Handler.java): 102) на android.os.Looper.loop (Looper.java:154) на android.app.ActivityThread.main (ActivityThread.java:6123) на java.lang.reflect.Method.invoke (собственный метод) на ком.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:867) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:757), вызванный: java.lang.IllegalStateException: попытка восстановитьоткройте уже закрытый объект: SQLiteDatabase: /data/user/0/com.example.dev/databases/test.db в android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55) в android.database.sqlite.SQLiteDatabase.executeSql (SQLiteDatabase.java:1660) в android.database.sqlite.SQLiteDatabase.execSQL (SQLiteDatabase.java:1606) в android.arch.persistence.db.framework.FrameworkSQLiteDatabase.execSQL (FrameworkSQLiteDatabase.java:242) в com.example.base.database.AppDatabase $ Companion $ MIGRATION_4_5 $ 1.migrate (AppDatabase.kt: 40) в android.arch.persistence.room.RoomOpenHelper.onUpgrade (RoomOpenHen.java: 85) в android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper $ OpenHelper.onUpgrade (FrameworkSQLiteOpenHelper.java:133) в android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked (SQLiteOpenHelper.java: 25: and.6)sqlite.SQLiteOpenHelper.getWritableDatabase (SQLiteOpenHelper.java:163) в android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper $ OpenHelper.getWritableSupportDatabase (FrameworkSQLiteOpenHelper.java:96ra.workde.WraF.workde.WraF.Web.Exper.Fid.Ru.Ru.FDFrameworkSQLiteOpenHelper.java:54) в android.arch.persistence.room.RoomDatabase.query (RoomDatabase.java:233) в com.example.base.database.daos.TimeTrackerContentDao_Impl.getAll (TimeTrackerContentDao_Impl.java:134) в com.content.appview.content.ContentActivity.onPause (ContentActivity.kt: 600) на android.app.Activity.performPause (Activity.java:6812) на android.app.Instrumentation.callActivityOnPause (Instrumentation.java:1344) на android.app.ActivityThread.performPauseActivityIfNeeded (ActivityThread.java:3735) в android.app.ActivityThread.performPauseActivity (ActivityThread.java:3712)на android.app.ActivityThread.performPauseActivity (ActivityThread.java:3686) на android.app.ActivityThread.handlePauseActivity (ActivityThread.java:3660) на android.app.ActivityThread.-wrap16 (ActivityThread.java) на android.app.ActivityThread$ H.handleMessage (ActivityThread.java:1485) на android.os.Handler.dispatchMessage (Handler.java:102) на android.os.Looper.loop (Looper.java:154) на android.app.ActivityThread.main (ActivityThread.java:6123) на java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:867) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:757)
Заранее спасибо.