【问题标题】:Room Database: Livedata observer more than actual row size房间数据库:Livedata 观察者超过实际行大小
【发布时间】:2021-10-24 01:58:52
【问题描述】:

我在 Room 数据库中只有一行,但是当我阅读它时,我得到两行一个值。 我不知道房间数据库是如何工作的,或者我遗漏了什么。

祝大家有个愉快的一天!

朋友模型

@Entity(tableName = "friend_table")
class FriendModel
    : Serializable {
    @PrimaryKey
    @NonNull
    var _id: String = ""
    ...
}

DAO 接口

@Dao
interface FriendDAO {
    ...
    @Query("select _id from friend_table")
    fun readRoomIdFriendsDAO() : LiveData<List<String>>
}

存储库

class UserRepository(private val userAPI: UserAPI, context : Context) {
    private val userDAO : UserDAO
    private val friendDAO : FriendDAO
    init {
        val userDatabase: UserRoomDatabase = UserRoomDatabase.getInstance(context)
        val friendDatabase: FriendRoomDatabase = FriendRoomDatabase.getInstance(context)

        userDAO = userDatabase.getUserDao()
        friendDAO = friendDatabase.getFriendDao()
    }
    ...
    fun readRoomIdFriendsDAO() : LiveData<List<String>> = friendDAO.readRoomIdFriendsDAO()
    
}

视图模型

class UserViewModel(private val userRepository: UserRepository) : ViewModel() {
      ...
      fun readRoomIdFriendsDAO() : LiveData<List<String>> = userRepository.readRoomIdFriendsDAO()
}

我在 MainActivity 中使用它

viewModel.readRoomIdFriendsDAO().observe(this,{ listRoomId ->
            if(listRoomId!=null && listRoomId.isNotEmpty()){
                for(item in listRoomId){
                    Log.e(TAG, "RoomId: $listRoomId")
                }
            }
        })

这就是我得到的

E/Log: RoomId: [IZnIP4srwDZiB1foauiZF6R60RF3]
...
E/Log: RoomId: [IZnIP4srwDZiB1foauiZF6R60RF3]

【问题讨论】:

  • 检查作为观察者父级的方法是否被调用了两次。 MainActivity 中的更多代码将帮助我们更好地理解。
  • 哦,我明白了,我会检查 MainActivity,我的 MainActivity 如果我把所有代码都放得不好,那我就太乱了。非常感谢

标签: android kotlin android-room


【解决方案1】:

你可能叫readRoomIdFriendsDAO() 两次。 Android源码在这种情况下没有错

【讨论】:

  • 请用英文分享你的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多