"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()
}
}
}
编辑:
getAllTags
在 AppRepository
:
suspend fun getAllTags(): List<Tag> {
return cardMasterDao!!.getAllTags()
}
getAllTags
在 CardMasterDao
:
@Query("SELECT * FROM Tag")
suspend fun getAllTags(): List<Tag>
有些用户 same issue with API 22.
您可以尝试来自 link 的建议:
- 不使用延迟外键来放松约束
- 确保您的磁盘未满
- 使用
JournalMode.TRUNCATE
- 捕获异常
如果你说 API 24 没了,我想这是一个错误。
由于您没有使用任何显式事务,我认为最好的机会是显式捕获异常。
希望对您有所帮助。
当我 运行 我的应用程序在 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()
}
}
}
编辑:
getAllTags
在 AppRepository
:
suspend fun getAllTags(): List<Tag> {
return cardMasterDao!!.getAllTags()
}
getAllTags
在 CardMasterDao
:
@Query("SELECT * FROM Tag")
suspend fun getAllTags(): List<Tag>
有些用户 same issue with API 22.
您可以尝试来自 link 的建议:
- 不使用延迟外键来放松约束
- 确保您的磁盘未满
- 使用
JournalMode.TRUNCATE
- 捕获异常
如果你说 API 24 没了,我想这是一个错误。
由于您没有使用任何显式事务,我认为最好的机会是显式捕获异常。
希望对您有所帮助。