无法使用Firebase显示我的目标列表

时间:2019-08-19 10:48:45

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

我通过以下方式向数据库添加目标:

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数据库中获得以下结构:

enter image description here

接下来,我尝试在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}")
            }
        })
    }

1 个答案:

答案 0 :(得分: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的节点,在参考中也应同时提及。