房间 - 同步@Delete all
Room - Synchronous @Delete all
假设我们想以最简单可能的方式替换Android房间数据库中的所有项目。这项任务的方法是什么?
在这种情况下@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)
}
这应该有效:
@Transaction
fun replaceUsers(users: List<User>) {
clearEntireTable()
insertAllUsers(users)
}
你还需要这个:
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertAllUsers(users: List<User>)
并且不要将其放在伴随对象中。
replaceUsers 中的内容是同步的,这意味着它将首先删除所有用户并放入新用户。但结果是异步的,因为 Room 不允许您在 mainThread 上查询。
Is @Query("DELETE FROM user") synchronous or asynchronous in this case?
您没有返回响应式类型(LiveData
、Single
等),也没有实现 suspend
函数。因此,这是同步的。
Is using @Transaction a viable solution?
这里没有必要。
假设我们想以最简单可能的方式替换Android房间数据库中的所有项目。这项任务的方法是什么?
在这种情况下@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)
}
这应该有效:
@Transaction
fun replaceUsers(users: List<User>) {
clearEntireTable()
insertAllUsers(users)
}
你还需要这个:
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertAllUsers(users: List<User>)
并且不要将其放在伴随对象中。
replaceUsers 中的内容是同步的,这意味着它将首先删除所有用户并放入新用户。但结果是异步的,因为 Room 不允许您在 mainThread 上查询。
Is @Query("DELETE FROM user") synchronous or asynchronous in this case?
您没有返回响应式类型(LiveData
、Single
等),也没有实现 suspend
函数。因此,这是同步的。
Is using @Transaction a viable solution?
这里没有必要。