房间 - 同步@Delete全部

问题描述 投票:0回答:2

假设我们想以最简单的方式替换Android Room DB中的所有项目。这项任务的方法是什么?

在这种情况下,@Query("DELETE FROM user")是同步还是异步?使用@Transaction是一个可行的解决方案吗?

@Dao
interface UserDao {

    companion object {
        fun replaceAll(instance: UserDao, users: List<User>) { 
            instance.clearEntireTable() // possibly asynchronous ? 
            insertAll(instance, users) // synchronous
        }

        private fun insertAll(instance: UserDao, users: List<User>) = users.forEach { instance.insert(it) }
    }

    @Query("DELETE FROM user")
    fun clearEntireTable()

    @Insert
    fun insert(user: User)

    @Delete
    fun delete(user: User)
}
android android-room android-database
2个回答
1
投票

这应该工作:

@Transaction
fun replaceUsers(users: List<User>) {
    clearEntireTable()
    insertAllUsers(users)
}

你还需要这个:

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertAllUsers(users: List<User>)

并且不要把它放在伴侣对象中。

replaceUsers中的内容将是同步的,这意味着它将首先删除所有这些并放入新的。但结果是异步,因为Room不允许您在mainThread上查询。


1
投票

在这种情况下@Query(“DELETE FROM user”)是同步还是异步?

您没有返回反应类型(LiveDataSingle等),并且您没有实现suspend函数。因此,这是同步的。

使用@Transaction是一个可行的解决方案吗?

这里没有必要。

© www.soinside.com 2019 - 2024. All rights reserved.