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/'")
            }

        }

    }
}

Подскажите, как исравить данную ошибку


Ответы (0 шт):