我有一个像下面这样的模型,我想添加一个新项目到好友数据,但它创建了一个无限循环。那我该怎么办呢?
@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 : ArrayList<String> = ArrayList()
}
我的DAO接口
@Update
suspend fun updateUserDAO(userModel : UserModel)
@Query("select * from user_table where _id =:id")
fun readUserById(id : String) : LiveData<UserModel>
我转换器
class ConvertersDAO {
@TypeConverter
fun fromString(value: String?): ArrayList<String?>? {
val listType: Type = object : TypeToken<ArrayList<String?>?>() {}.type
return Gson().fromJson(value, listType)
}
@TypeConverter
fun fromArrayList(list: ArrayList<String?>?): 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)
})
}
问题在于您获得UserModel
的方式。你观察到它是LiveData
,并在同一个块中更新它,所以每次你更新用户,都会触发可观察代码块再次更新,并导致这个无限循环。
一个简单的修复是引入一个非LiveData
的方式从数据库获取用户
@Query("select * from user_table where _id =:id")
suspend fun readUserByIdSync(id : String) : UserModel