android - Room Persistence 库数据库被锁定(代码 5)
问题描述
我正在尝试更长的时间来找到绕过此问题或修复它但没有成功的解决方案。
我正在使用最新版本的库2.4.0-alpha04,因为它提供了 AutoMigration,我发现它非常有用。简而言之,我跟踪日志很长一段时间,似乎只有在从另一个上下文同时访问数据库时才会发生这种情况。
我的应用程序在 MainActivity 和前台服务中使用数据库,这是一个单独的进程。
我一直认为问题就在那里,但我不确定。从日志中,当服务和应用程序尝试同时写入时会发生问题,而服务会不断更新数据库。
companion object {
private const val DATABASE = "BatteryInfoDatabase"
private var instance: BatteryInfoDatabase? = null
fun getDatabase(context: Context?): BatteryInfoDatabase? {
if (instance == null) {
synchronized(BatteryInfoDatabase::class.java) {
if (instance == null) {
instance = Room.databaseBuilder(
context!!,
BatteryInfoDatabase::class.java, DATABASE)
.allowMainThreadQueries()
.fallbackToDestructiveMigration()
.build()
}
}
}
return instance
}
}
这是日志输出
Fatal Exception: java.lang.RuntimeException
Unable to start activity ComponentInfo{com.paget96.batteryguru/activities.MainActivity}: android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_mode ################################################################# Error Code : 5 (SQLITE_BUSY) Caused By : The database file is locked. (database is locked (code 5): , while compiling: PRAGMA journal_mode) #################################################################
android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2695)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1200)
Caused by android.database.sqlite.SQLiteDatabaseLockedException
database is locked (code 5): , while compiling: PRAGMA journal_mode ################################################################# Error Code : 5 (SQLITE_BUSY) Caused By : The database file is locked. (database is locked (code 5): , while compiling: PRAGMA journal_mode) #################################################################
android.database.sqlite.SQLiteConnection.nativePrepareStatement (SQLiteConnection.java)
androidx.room.RoomDatabase.assertNotSuspendingTransaction (RoomDatabase.java:482)
com.paget96.batteryguru.utils.database.batteryinfo.TemperatureHistoryDao_Impl.getTemperatureHistory (TemperatureHistoryDao_Impl.java:106)
com.paget96.batteryguru.utils.database.batteryinfo.BatteryInfoDatabase.getTemperatureHistory (BatteryInfoDatabase.java:76)
com.paget96.batteryguru.fragments.FragmentChargingInfo.temperatureHistoryChart (FragmentChargingInfo.java:247)
com.paget96.batteryguru.fragments.FragmentChargingInfo.initializeViews (FragmentChargingInfo.java:83)
com.paget96.batteryguru.fragments.FragmentChargingInfo.onViewCreated (FragmentChargingInfo.java:218)
androidx.fragment.app.Fragment.performViewCreated (Fragment.java:2985)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1200)
解决方案
推荐阅读
- python - 单击命令不再是功能
- javascript - 最佳实践:具有数组数据类型的 JavaScript 中的条件语句
- python - 如何从 Pandas 平行坐标中删除图例并调整画布/图像的大小?
- django - 无法在本地网络中托管 django 项目
- webpack - 我可以使用 Webpack v3 减少我的包大小吗?
- json - 通过 Cloudfront 在 cloudformation 中使用 Route53 模板
- javascript - 条件 html 元素仅临时显示
- laravel - 如何使用 vscode 查看 $request 及其子方法中的所有可用方法?
- javascript - Discord.js V12 如何从 args 中删除提到的用户?
- javascript - 如何在博客上按月调用 javascript 函数