如何从 Firebase android kotlin 获取所有具有特定价值的孩子?

Posted

技术标签:

【中文标题】如何从 Firebase android kotlin 获取所有具有特定价值的孩子?【英文标题】:how to get all child with specific value from Firebase android kotlin? 【发布时间】:2021-05-30 05:33:32 【问题描述】:

我想从我的数据库中的所有用户那里获取图像中的颜色项。我试试这个

private fun setListPersonOfferService()
    val database = FirebaseDatabase.getInstance()
    val userIdReference = database.getReference("user personal data").child("Country")
    val userFilterListener = object : ValueEventListener 
        override fun onCancelled(databaseError: DatabaseError) 
            // handle error
        
        override fun onDataChange(dataSnapshot: DataSnapshot) 
            val listTest = dataSnapshot.children.map  it.getValue(HomePageModel::class.java)!! 

                itemAdapter = ItemAdapterHomePage(context ?: return,
                    listTest as ArrayList<HomePageModel>
                )
                itemAdapter?.onItemClick = 
                    Supplier.serviceList[it].state = !Supplier.serviceList[it].state

                    itemAdapter?.notifyDataSetChanged()
                    Toast.makeText(context, "go to speck", Toast.LENGTH_LONG).show()
                

                recyclerView_homePage.apply 
                    layoutManager = LinearLayoutManager(context)
                    adapter = itemAdapter
                
            
        
    userIdReference.addListenerForSingleValueEvent(userFilterListener)


class HomePageModel(var lastName: String?=null,
                     var town: String?=null,
                     var faculty: String?=null,
                     var languageOfStudy: String?=null )

如果我更改对特定目录.child("Turcia").child("Adana").child("Çukurova University").child("Faculty of Business") 的引用,它可以工作,但我想从所有用户那里获取。

【问题讨论】:

【参考方案1】:

您需要浏览 onDataChange 中的 dataSnapshot 才能找到正确的子节点。

要浏览DataSnapshot object,您有两种主要方法:

    您已经知道要访问的子节点的密钥,在这种情况下,您可以使用child() method 访问该特定子节点。例如,您可以使用 dataSnapshot.child("Turcia/Adana/Çukurova University/Faculty of Business").children.map 读取 JSON 中标记的子项,类似于您已经在参考上尝试过的内容。 您不知道子节点的键,在这种情况下,您将遍历快照的getChildren() property。有关后者的示例,请参阅 listening for value events on a list of children 上的 Firebase 文档。

我认为您在这里寻找第二种方法,但无论如何您正在处理DataSnapshots,有一些方法可以获取那里的数据。

【讨论】:

var list = ArrayList&lt;HomePageModel&gt;() for (data in dataSnapshot.children) user = data.getValue(HomePageModel::class.java) list.add(user as HomePageModel) 我也试过了,但还是不行,因为它只查看参考中的孩子 这将使您通过 JSON 中的一个级别。您需要在读取表单的位置和 HomePageModel 类映射到 JSON 中的属性的位置之间为 JSON 中的每个级别选择方法。 你能帮我举个例子吗? 这只是做更多相同的事情。您当前的for (data in dataSnapshot.children) 循环遍历Country 节点的子节点,因此data.key 将是Turcia。如果你在这个for (data2 in data.children) 中嵌套一个额外的循环,那么你的data2.key 将是Adana。您需要为您不知道要读取的密钥的每个级别的 JSON 嵌套这样的循环(我的答案中的选项 2)。一旦你知道了键名,你就可以使用选项 1 - 这也是你的 data.getValue(HomePageModel::class.java) 的作用。

以上是关于如何从 Firebase android kotlin 获取所有具有特定价值的孩子?的主要内容,如果未能解决你的问题,请参考以下文章

如何从android上的firebase获取用户uid?

如何从android中的firebase获取对象?

如何从android下载firebase数据库作为CSV文件

如何使用 HashMap 从 Android 的 Firebase 中的子节点获取数据?

如何在 Android 中使用 MVC 模式从 firebase 检索数据? [复制]

如何使用 java/android 从 Firebase ONCE 读取数据?