Android + Room + попытка повторно открыть уже закрытый объект: SQLiteDatabase: - После добавления миграции - PullRequest
0 голосов
/ 21 ноября 2018

Я добавил библиотеку базы данных 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)

Заранее спасибо.

1 Ответ

0 голосов
/ 29 марта 2019

Убедитесь, что схема базы данных также была изменена на 5

@[Database(
        entities = [
             /* ... */
        ],
        version = 5
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...