gpt4 book ai didi

Android + Room + 尝试重新打开一个已经关闭的对象 : SQLiteDatabase: - After adding migration

转载 作者:太空宇宙 更新时间:2023-11-03 10:57:50 25 4
gpt4 key购买 nike

我已经为我的一个 Android 应用程序添加了 Romm 数据库库,并且现在已经正确使用它一段时间了,但现在我必须更新该应用程序,并且我想向它添加数据库迁移。

我已经关注了多个教程、博客和官方文档,并尝试添加迁移。

但是,当我尝试添加数据库迁移时,即使在为多个版本添加迁移后,我也会遇到同样的错误,例如,java.lang.IllegalStateException:尝试重新打开一个已经关闭的对象:SQLiteDatabase:(数据库路径)

这是迁移的代码。

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()

如果有人有任何想法请帮忙。

崩溃日志,

E/AndroidRuntime: FATAL EXCEPTION: main java.lang.RuntimeException: Unable to pause activity {com.example.dev/com.example.content.appview.content.ContentActivity}: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/user/0/com.example.dev/databases/test.db at android.app.ActivityThread.performPauseActivityIfNeeded(ActivityThread.java:3746) at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3712) at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3686) at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3660) at android.app.ActivityThread.-wrap16(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1485) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6123) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/user/0/com.example.dev/databases/test.db at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55) at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1660) at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1606) at android.arch.persistence.db.framework.FrameworkSQLiteDatabase.execSQL(FrameworkSQLiteDatabase.java:242) at com.example.base.database.AppDatabase$Companion$MIGRATION_4_5$1.migrate(AppDatabase.kt:40) at android.arch.persistence.room.RoomOpenHelper.onUpgrade(RoomOpenHelper.java:85) at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onUpgrade(FrameworkSQLiteOpenHelper.java:133) at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:256) at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:96) at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:54) at android.arch.persistence.room.RoomDatabase.query(RoomDatabase.java:233) at com.example.base.database.daos.TimeTrackerContentDao_Impl.getAll(TimeTrackerContentDao_Impl.java:134) at com.example.content.appview.content.ContentActivity.onPause(ContentActivity.kt:600) at android.app.Activity.performPause(Activity.java:6812) at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1344) at android.app.ActivityThread.performPauseActivityIfNeeded(ActivityThread.java:3735) at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3712)  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3686)  at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3660)  at android.app.ActivityThread.-wrap16(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1485)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:154)  at android.app.ActivityThread.main(ActivityThread.java:6123)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) 

提前致谢。

最佳答案

请确保数据库架构也已更改为 5

@[Database(
entities = [
/* ... */
],
version = 5
)

关于Android + Room + 尝试重新打开一个已经关闭的对象 : SQLiteDatabase: - After adding migration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53405489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com