#android #kotlin #android-room
Вопрос:
У меня есть модель, как показано ниже, я хочу добавить новый элемент в данные друзей, но это создает бесконечный цикл. Так что же мне делать?
@Entity(tableName = "user_table") class UserModel : Serializable { @PrimaryKey @NonNull var _id: String = "" var userName: String? = null var userAvatar: String? = null @TypeConverters(ConvertersDAO::class) var friends : ArrayListlt;Stringgt; = ArrayList() }
Мой интерфейс DAO
@Update suspend fun updateUserDAO(userModel : UserModel) @Query("select * from user_table where _id =:id") fun readUserById(id : String) : LiveDatalt;UserModelgt;
Мои преобразователи
class ConvertersDAO { @TypeConverter fun fromString(value: String?): ArrayListlt;String?gt;? { val listType: Type = object : TypeTokenlt;ArrayListlt;String?gt;?gt;() {}.type return Gson().fromJson(value, listType) } @TypeConverter fun fromArrayList(list: ArrayListlt;String?gt;?): String? { val gson = Gson() return gson.toJson(list) } }
и то, что я пробовал до сих пор(но это так плохо работает)
private fun updateFriend() { val friendId = "foo" viewModel.readUserByIdDAO(userId).observe(this,{ val listTemp = it.friends listTemp.add(friendId) it.friends = listTemp viewModel.updateUserDAO(it) }) }
Ответ №1:
Проблема в том, как вы это получаете UserModel
. Вы наблюдаете за ним как LiveData
и обновляете его в одном и том же блоке , и поэтому каждый раз, когда вы обновляете пользователя, это вызывает повторное обновление наблюдаемого блока кода и приводит к этому бесконечному циклу.
Простое исправление состоит в том, чтобы ввести не LiveData
способ получения пользователя из базы данных
@Query("select * from user_table where _id =:id") suspend fun readUserByIdSync(id : String) : UserModel
Комментарии:
1. о, я понял. большое спасибо, хорошего дня!