【问题标题】:Can't display list of my targets with firebase无法使用 Firebase 显示我的目标列表
【发布时间】:2019-08-19 10:48:45
【问题描述】:

我以这种方式将目标添加到数据库中:

private fun addTarget(name: String, description: String) {
    if (!TextUtils.isEmpty(name)) {
        val target = Target(guid = "some", name = name, description = description)
        databaseReference?.child("users")
            ?.child(mUserId.toString())?.child("targets")?.push()?.setValue(target)
    } else Log.d("some", "Enter a name")
}

并在我的 firebase 数据库中获取以下结构:

接下来,我尝试在TargetsFragment 中显示我的目标列表 在onViewCreated 我调用下一个函数:

private fun updateListData() {
        databaseReference = FirebaseDatabase.getInstance().getReference()
        getTargetsFromDb()
    }
private fun getTargetsFromDb() {
        databaseReference?.child("users")?.child(mUserId.toString())?.
            child("targets")?.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                for (targetSnapshot in dataSnapshot.children) {
                    val target = targetSnapshot.getValue(Target::class.java)
                    target?.let { targetList.add(it) }
                }
                recyclerView?.adapter = adapter
            }

            override fun onCancelled(databaseError: DatabaseError) {
                Log.d("some", "Error trying to get targets for ${databaseError.message}")
            }
        })
    }

【问题讨论】:

  • 我在您的数据库中看不到任何禁止字符。您确定在添加数据时没有收到该错误吗?
  • @AlexMamo 我解决了这个错误的问题,但也无法显示我的目标
  • @Morozov 你的意思是不能显示我的目标。你能登录targetList检查是否添加了数据。
  • @Ashish 数据为空(但在 firebase 控制台中我可以添加此目标,现在尝试解决通信片段问题
  • 如果你使用Log.d(TAG, target.name) logcat 会打印什么?

标签: android firebase firebase-realtime-database android-recyclerview


【解决方案1】:

正如我所说,因为我看不到您做了什么更改,所以我编写了可以帮助您从数据库中获取数据的代码:

val uid = FirebaseAuth.getInstance().currentUser!!.uid
val rootRef = FirebaseDatabase.getInstance().reference
val targetsRef = rootRef!!.child("targets").child("users").child(uid).child("targets")
val valueEventListener = object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        for (ds in dataSnapshot.children) {
            val target = ds.getValue(Target::class.java)
            targetList.add(target)
        }
        adapter.notifyDataSetChanged()
    }

    override fun onCancelled(databaseError: DatabaseError) {
        Log.d(TAG, databaseError.getMessage()) //Don't ignore errors!
    }
}
targetsRef.addListenerForSingleValueEvent(valueEventListener)

logcat 中的输出将是:

uuuuu
yyyyy

即使您使用两个具有相同名称的节点targets,也应在参考中提及。

【讨论】:

  • 超级!,现在我可以在日志中找到我的目标 现在我只需要在 recyclerView 中显示它们
  • 在这种情况下,只需获取DataSnapshot 对象并将其转换为Target 类型的对象(就像您在代码中所做的那样)。将这些对象添加到列表中,您的问题将得到解决。当它起作用时请向我确认。
猜你喜欢
  • 2019-12-07
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 2021-08-09
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多