Комната - Синхронный @ Удалить все - PullRequest
0 голосов
/ 22 февраля 2019

Предположим, что мы хотели бы заменить все элементы в 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)
}

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Является ли @Query («УДАЛИТЬ ИЗ ПОЛЬЗОВАТЕЛЯ») синхронным или асинхронным в этом случае?

Вы не возвращаете реактивный тип (LiveData, Single и т. Д.).), и вы не реализуете функцию suspend.Следовательно, это синхронно.

Является ли использование @Transaction жизнеспособным решением?

В этом нет необходимости.

0 голосов
/ 22 февраля 2019

Это должно работать:

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

, а также вам нужно это:

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

И не помещайте его в объект-компаньон.

Что внутриreplaceUsers будет синхронным, что означает, что он сначала удалит все из них и поместит новые.Но результат асинхронный, потому что Room не позволяет запрашивать mainThread.

...