MST

星途 面试题库

面试题:Kotlin的Android Room数据库中如何进行事务处理

假设你有一个场景,需要在Android Room数据库中对多个数据表进行一系列操作,如向表A插入一条记录,同时更新表B的某条记录,这一系列操作需要保证原子性,即要么全部成功,要么全部失败。请用Kotlin代码展示如何在Room数据库中实现这样的事务处理。
21.9万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试
import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.Transaction

@Database(entities = [TableA::class, TableB::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun tableADao(): TableADao
    abstract fun tableBDao(): TableBDao

    @Transaction
    open fun performTransaction() {
        tableADao().insert(TableA())
        tableBDao().update(TableB())
    }
}

@Dao
interface TableADao {
    @Insert
    fun insert(tableA: TableA)
}

@Dao
interface TableBDao {
    @Update
    fun update(tableB: TableB)
}

data class TableA(
    // 定义表A的字段
)

data class TableB(
    // 定义表B的字段
)

在上述代码中:

  1. AppDatabase 是定义数据库的抽象类,包含两个 Dao 的抽象方法。
  2. performTransaction 方法标记为 @Transaction,意味着其中的操作会作为一个事务执行,要么全部成功,要么全部失败。
  3. TableADaoTableBDao 分别定义了对表A和表B的操作方法。
  4. TableATableB 是对应表的实体类。

使用时,通过 AppDatabase 的实例调用 performTransaction 方法即可执行该事务。例如:

val database = Room.databaseBuilder(
    context,
    AppDatabase::class.java,
    "app-database"
).build()
database.performTransaction()