Я получаю эту ошибку, когда запускаю свое приложение на устройстве с API 23, используя библиотеку Room. Это происходит при первом запуске, но я не могу пройти мимо введения в приложение, потому что это происходит каждый раз.
Fatal Exception: android.database.sqlite.SQLiteException: cannot rollback - no transaction is active (code 1)
at android.database.sqlite.SQLiteConnection.nativeExecute(SQLiteConnection.java)
at android.database.sqlite.SQLiteConnection.execute(SQLiteConnection.java:553)
at android.database.sqlite.SQLiteSession.endTransactionUnchecked(SQLiteSession.java:439)
at android.database.sqlite.SQLiteSession.endTransaction(SQLiteSession.java:401)
at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:522)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:262)
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.SQLiteCopyOpenHelper.getWritableDatabase(SQLiteCopyOpenHelper.java:90)
at androidx.room.RoomDatabase.inTransaction(RoomDatabase.java:476)
at androidx.room.RoomDatabase.assertNotSuspendingTransaction(RoomDatabase.java:281)
at com.diamonddevelopment.cardapp.data.CardMasterDao_Impl.getAllTags(CardMasterDao_Impl.java:1381)
at com.diamonddevelopment.cardapp.data.AppRepository.getAllTags(AppRepository.kt:158)
at com.diamonddevelopment.cardapp.activities.MainActivity$Companion$loadTags$1.run(MainActivity.kt:316)
at java.lang.Thread.run(Thread.java:818)
Это не происходит на API 24 и выше. Это ошибка? Так я создаю базу данных комнат:
fun getAppDatabase(context: Context): CardMasterDatabase? {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.applicationContext, CardMasterDatabase::class.java, FILE_NAME).createFromAsset(databases/$FILE_NAME).build()
}
return INSTANCE
}
И как я им пользуюсь:
private var cardMasterDao: CardMasterDao? = null
init {
cardMasterDao = when {
CardMasterDatabase.INSTANCE != null -> {
CardMasterDatabase.INSTANCE!!.cardMasterDao()
}
else -> {
CardMasterDatabase.getAppDatabase(context)!!.cardMasterDao()
}
}
}