Fatal Exception: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase

旧时模样 提交于 2020-03-05 06:53:30

问题


While updating Room database I get an error:

 Fatal Exception: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: *****************
   at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
   at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1312)
   at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1291)
   at android.arch.persistence.db.framework.FrameworkSQLiteDatabase.query(FrameworkSQLiteDatabase.java:161)
   at android.arch.persistence.db.framework.FrameworkSQLiteDatabase.query(FrameworkSQLiteDatabase.java:150)
   at android.arch.persistence.room.RoomOpenHelper.hasRoomMasterTable(RoomOpenHelper.java:151)
   at android.arch.persistence.room.RoomOpenHelper.checkIdentity(RoomOpenHelper.java:123)
   at android.arch.persistence.room.RoomOpenHelper.onOpen(RoomOpenHelper.java:115)
   at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onOpen(FrameworkSQLiteOpenHelper.java:151)
   at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:266)
   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 *****************.SettingsDao_Impl$3.call(SettingsDao_Impl.java:105)
   at *****************.SettingsDao_Impl$3.call(SettingsDao_Impl.java:102)
   at android.arch.persistence.room.RxRoom$4.apply(RxRoom.java:111)
   at android.arch.persistence.room.RxRoom$4.apply(RxRoom.java:108)
   at io.reactivex.internal.operators.flowable.FlowableMap$MapConditionalSubscriber.tryOnNext(FlowableMap.java:124)
   at io.reactivex.internal.operators.flowable.FlowableObserveOn$ObserveOnConditionalSubscriber.runAsync(FlowableObserveOn.java:637)
   at io.reactivex.internal.operators.flowable.FlowableObserveOn$BaseObserveOnSubscriber.run(FlowableObserveOn.java:176)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

What I have done:

  • I have added tables: table_d, table_e, table_f
  • Updated database version to 4
  • Implemented migrations: from 1 to 2, from 2 to 3, from 3 to 4
  • Wrote migration tests, that passed successful
  • Updated Room version from 1.1.0 to 1.1.1
  • Added proguard rules

Currently I am getting such errors for table_a, table_b, table_c, but there are also several more tables, so I don't get this error for all of the tables.

The error also does not happen for all of the users, but only for some ...

Gradle:

implementation "android.arch.persistence.room:runtime:1.1.1"
implementation "android.arch.persistence.room:rxjava2:1.1.1"
annotationProcessor "android.arch.persistence.room:compiler:1.1.1"
kapt "android.arch.persistence.room:compiler:1.1.1"

Database class:

@Database(
    entities = [
            table_a::class,
            table_b::class,
            table_c::class,
            table_d::class,
            table_e::class,
            table_f::class],
    version = 4)
@TypeConverters(Converters::class)
abstract class DataBase : RoomDatabase() {

abstract fun tableADao(): TableADao
// ... and so on for all table daos

companion object {

    @Volatile
    private var INSTANCE: ILDataBase? = null

    fun getILDataBaseInstance(appContext: Context): ILDataBase =
            INSTANCE ?: synchronized(this) {
                INSTANCE ?:initDatabase(appContext).also { INSTANCE = it }
            }

    private fun initDatabase(appContext: Context): DataBase {
        return Room.databaseBuilder(appContext,
                DataBase::class.java, "databasename_db")
                .addMigrations(
                        Migrations.MIGRATION_1_2,
                        Migrations.MIGRATION_2_3,
                        Migrations.MIGRATION_3_4
                )
                .fallbackToDestructiveMigration()
                .build()
        }
    }
}

来源:https://stackoverflow.com/questions/51283268/fatal-exception-java-lang-illegalstateexception-attempt-to-re-open-an-already

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!