原因:java.lang.IllegalStateException:尝试重新打开一个已经关闭的对象:SQLiteDatabase

Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase

我的 Room 有这个问题,Yandex Metrica 在首次从 Market 安装的设备上检测到了这个问题,所以这不可能是迁移问题。我还在不同的真实设备和 AVD 设备上测试过它,但无法重现。根据 Yandex Metrica 日志,此问题可以在 android 5.0.1 到 9 的版本上重现。

房间版本:1.1.1

我认为我的问题与此类似one,但那里没有正确答案。

java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask.done(AsyncTask.java:354)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/user/0/one.sendy.messenger/databases/Socialmessanger_database
        at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
        at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1861)
        at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1840)
        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:411)
        at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:298)
        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.compileStatement(RoomDatabase.java:244)
        at android.arch.persistence.room.SharedSQLiteStatement.createNewStatement(SharedSQLiteStatement.java:65)
        at android.arch.persistence.room.SharedSQLiteStatement.getStmt(SharedSQLiteStatement.java:72)
        at android.arch.persistence.room.SharedSQLiteStatement.acquire(SharedSQLiteStatement.java:87)
        at com.social.soc.repository.repositorycore.daos.ChatMessageDao_Impl.deleteAll(ChatMessageDao_Impl.java:697)
        at com.social.soc.repository.repositorycore.Repository.clearDatabaseSync(Repository.java:680)
        at com.social.soc.repository.repositorycore.Repository.lambda$deleteAllData$Repository(Repository.java:669)
        at com.social.soc.repository.repositorycore.-$$Lambda$Repository$Wk_rZJ-sdwid6vlvxvXj1SzYXr8.run(Unknown Source)
        at beta.framework.android.util.async.AsyncWorker$AsyncTaskExec.doInBackground(AsyncWorker.java:51)
        at beta.framework.android.util.async.AsyncWorker$AsyncTaskExec.doInBackground(AsyncWorker.java:39)
        at android.os.AsyncTask.call(AsyncTask.java:333)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        ... 3 more

这是我用 db 做的事情:

chatMessageDao.deleteAll();

道​​中:

 @Query("DELETE FROM chatmessage")
    void deleteAll();

这不是迁移问题,因为: 1)首先安装; 2) 它在 5% 的设备上复制; 3) 如果是迁移问题,它通常会说 "expected" 和 "found".

我也找到了这个issue on GitHub, that leads me to this one。看起来这个问题确实存在,但他们在 Room 2.1.0 中修复了它。但是我的 gradle 说最新版本是 1.1.1。而且我使用的是支持库而不是 androidx。

更新:

我在 androidx 上迁移了项目,修复了一些冲突,一切似乎都运行良好。但是因为我无法重现这个问题,如果有帮助的话,我会在稍后报告这个问题。

感谢大家的帮助。

此问题已在更高版本的 Room 中解决。尝试在您当前使用的版本上解决它是没有用的。请更新,因为您使用的版本已经快 2 年了

检查此 link 以查看哪个版本是最新的:https://developer.android.com/jetpack/androidx/releases/room