Android Room Lock database
в Play Console у одного пользователя приложение падает из-за блокировки database. Думаю это возникает из-за доступа из нескольких потоков
Error
android.database.sqlite.SQLiteException:
at android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration (SQLiteConnection.java:402)
at android.database.sqlite.SQLiteConnection.open (SQLiteConnection.java:223)
at android.database.sqlite.SQLiteConnection.open (SQLiteConnection.java:198)
at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked (SQLiteConnectionPool.java:463)
at android.database.sqlite.SQLiteConnectionPool.open (SQLiteConnectionPool.java:185)
at android.database.sqlite.SQLiteConnectionPool.open (SQLiteConnectionPool.java:177)
at android.database.sqlite.SQLiteDatabase.openInner (SQLiteDatabase.java:838)
at android.database.sqlite.SQLiteDatabase.open (SQLiteDatabase.java:823)
at android.database.sqlite.SQLiteDatabase.openDatabase (SQLiteDatabase.java:716)
at android.app.ContextImpl.openOrCreateDatabase (ContextImpl.java:664)
at android.content.ContextWrapper.openOrCreateDatabase (ContextWrapper.java:289)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked (SQLiteOpenHelper.java:223)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase (SQLiteOpenHelper.java:163)
at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase (FrameworkSQLiteOpenHelper.java:92)
at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase (FrameworkSQLiteOpenHelper.java:53)
at androidx.room.RoomDatabase.inTransaction (RoomDatabase.java:476)
at androidx.room.RoomDatabase.assertNotSuspendingTransaction (RoomDatabase.java:281)
at com.app.peshkariki.Dao.SettingsDao_Impl.insert (SettingsDao_Impl.java:285)
at com.app.peshkariki.MyApplication$onCreate$1.run (MyApplication.java:67)
at android.os.AsyncTask$SerialExecutor$1.run (AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:607)
at java.lang.Thread.run (Thread.java:761)
Caused by: android.database.sqlite.SQLiteDatabaseLockedException:
at android.database.sqlite.SQLiteConnection.nativeExecute (SQLiteConnection.java)
at android.database.sqlite.SQLiteConnection.execute (SQLiteConnection.java:564)
at android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration (SQLiteConnection.java:376)
at android.database.sqlite.SQLiteConnection.open (SQLiteConnection.java:223)
at android.database.sqlite.SQLiteConnection.open (SQLiteConnection.java:198)
at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked (SQLiteConnectionPool.java:463)
at android.database.sqlite.SQLiteConnectionPool.open (SQLiteConnectionPool.java:185)
at android.database.sqlite.SQLiteConnectionPool.open (SQLiteConnectionPool.java:177)
at android.database.sqlite.SQLiteDatabase.openInner (SQLiteDatabase.java:838)
at android.database.sqlite.SQLiteDatabase.open (SQLiteDatabase.java:823)
at android.database.sqlite.SQLiteDatabase.openDatabase (SQLiteDatabase.java:716)
at android.app.ContextImpl.openOrCreateDatabase (ContextImpl.java:664)
at android.content.ContextWrapper.openOrCreateDatabase (ContextWrapper.java:289)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked (SQLiteOpenHelper.java:223)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase (SQLiteOpenHelper.java:163)
at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase (FrameworkSQLiteOpenHelper.java:92)
at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase (FrameworkSQLiteOpenHelper.java:53)
at androidx.room.RoomDatabase.inTransaction (RoomDatabase.java:476)
at androidx.room.RoomDatabase.assertNotSuspendingTransaction (RoomDatabase.java:281)
at com.app.peshkariki.Dao.SettingsDao_Impl.insert (SettingsDao_Impl.java:285)
at com.app.peshkariki.MyApplication$onCreate$1.run (MyApplication.java:67)
at android.os.AsyncTask$SerialExecutor$1.run (AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:607)
at java.lang.Thread.run (Thread.java:761)
введите сюда код
Ошибка как я понял происходит в MyApplication
try {
val db = AppDatabase.getDatabase(this)
val settingsDao = db.settingsDao()
AsyncTask.execute {
try {
val settings = settingsDao.get
if (settings.token == "") {
val temp = Settings()
temp.apiUrl = settings.apiUrl
settingsDao.insert(temp)
}
} catch (e: Exception) {
e.printStackTrace()
settingsDao.insert(Settings(apiUrl = ConstantsApiUrl.BaseURL))
}
}
} catch (e: Exception) {
e.printStackTrace()
}
67 строчка, это settingsDao.insert(Settings(apiUrl = ConstantsApiUrl.BaseURL))
Хотя в Instance database установлен lock
abstract class AppDatabase : RoomDatabase() {
abstract fun settingsDao(): SettingsDao
abstract fun ticketsDao(): TiketsDao
abstract fun myOrderDao(): MyOrderCourierDao
abstract fun instructionOrderDao(): OrderInstruction
abstract fun bankCardDao(): BankCardDao
companion object {
@Volatile
private var instance: AppDatabase? = null
fun getDatabase(context: Context): AppDatabase {
if (instance == null) {
synchronized(this) {
instance = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"test.db"
).addMigrations(migration1_2)
.addMigrations(migration2_3)
.build()
}
}
return instance as AppDatabase
}
fun destroyInstance() {
instance = null
}
private val migration1_2 = object : Migration(16, 17) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE BankCard (id INTEGER PRIMARY KEY NOT NULL, " +
"numberCard TEXT NOT NULL, " +
"paySistemCard TEXT NOT NULL, " +
"balanceCard INTEGER NOT NULL, " +
"issuer TEXT NOT NULL, " +
"selectedAutoPay INTEGER NOT NULL, " +
"inChecked INTEGER NOT NULL)")
}
}
private val migration2_3 = object : Migration(17, 18) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("UPDATE Settings set apiUrl = 'https://3.peshkariki.ru/eApis/app/' WHERE apiUrl = 'https://alt4.peshkariki.ru/eApis/app/'")
}
}
}
}
Подскажите, как исравить данную ошибку