"Cannot rollback - no transaction is active (code 1)" 在 API 23 台设备上使用 Android 房间库时

"Cannot rollback - no transaction is active (code 1)" when using Android Room library on API 23 device

当我 运行 我的应用程序在 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.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()
            }
        }
    }

编辑:

getAllTagsAppRepository:

suspend fun getAllTags(): List<Tag> {
    return cardMasterDao!!.getAllTags()
}

getAllTagsCardMasterDao:

@Query("SELECT * FROM Tag")
suspend fun getAllTags(): List<Tag>

有些用户 same issue with API 22.

您可以尝试来自 link 的建议:

  • 不使用延迟外键来放松约束
  • 确保您的磁盘未满
  • 使用JournalMode.TRUNCATE
  • 捕获异常

如果你说 API 24 没了,我想这是一个错误。

由于您没有使用任何显式事务,我认为最好的机会是显式捕获异常。

希望对您有所帮助。