首页 > 解决方案 > 如何向具有 ArrayList 属性的数据添加新项目?

问题描述

我有一个像下面这样的模型,我想向朋友数据中添加一个新项目,但它正在创建一个无限循环。所以我该怎么做?

@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)
        })
    }

标签: androidkotlinandroid-room

解决方案


问题在于您获取UserModel. 您将其观察为LiveData,并在同一块中对其进行更新,因此每次更新用户时,都会触发可观察代码块再次更新并导致此无限循环。

一个简单的解决方法是引入一种LiveData从数据库中获取用户的非方法

@Query("select * from user_table where _id =:id")
suspend fun readUserByIdSync(id : String) : UserModel

推荐阅读