java - 使用特定 orderby 从包含多个子节点的 FireBase 数据库检索数据

标签 java android database firebase firebase-realtime-database

我一直在尝试在不知道“蓝色”键值的情况下检索“红色”数据(假设有多个具有随机键的子项),但我无法提供适当的代码。 这是 Firebase 子树。

db image

我尝试编写此代码,但它不起作用(我是初学者)

 List<String> idlist = new ArrayList<String>();
 DatabaseStage = FirebaseDatabase.getInstance().getReference("Stages");
 Query query = DatabaseStage.orderByChild("uniqueId").equalTo(stageid);
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            Iterable<DataSnapshot> stagedata = dataSnapshot.child("userEtudList").getChildren();
            for(DataSnapshot it: stagedata){
                if (!(it.getValue().equals("test"))){
                    idlist.add(it.getValue().toString());
                }
            }

Ps:如果您想知道 orderByChild(uniqueId).equalTo(stageid) 的使用,在这种情况下 stageid 等于 2fdedf71-4346-4395-bee5-38db04d4fd47 它允许我选择一个特定的子级,即第二个一个。

这是使用断点获取的变量的状态,您可以看到它不断获取 {key = userEtudList , Value =null} 但没有获取 Children 的 Datasnapshot

image

最佳答案

出于此答案的目的,我将您的问题解释为“我想在所选 userEtudList 节点中生成所有值的列表,而不考虑它们的键Stages 节点。(例如,告诉我该类(class)中有哪些学生)。同样,处理 test 值的代码实际上只是测试代码,与此无关挑战。


您的问题是 dataSnapshot 并不是真正的单个节点。它是您进行查询的数据库级别的所有匹配节点的集合。在这种情况下,由于您的 equalTo 而只有一项这一事实并不重要。 (例如,想象一下在查询中没有 equalTo 调用的情况下这段代码如何工作 - 它不能,因为它不知道快照中的哪个项目要获取 userEtudList child 从!)。这就是为什么当您尝试获取 userEtudList 子项时快照为空的原因。 Doc Reference

Calling getValue() on a snapshot returns the Java object representation of the data. If no data exists at the location, calling getValue() returns null.

要解决此问题,您可能应该断言 dataSnapshot.getChildrenCount() == 1,然后:

Iterable<DataSnapshot> stagedata = dataSnapshot.getChildren()
    .iterator().next()
    .child("userEtudList").getChildren();

如果您能够以某种方式依赖于始终等于 uniqueId 的键名称(我不清楚为什么您将 uniqueId 存储为键以外的其他内容)无论如何//可能,这只是使用数据库屏幕截图的产物)您可以通过以下方式避免这种情况:

Iterable<DataSnapshot> stagedata = dataSnapshot.child(stageid)
    .child("userEtudList").getChildren();

当然,在这种情况下,可以删除整个查询,直接检索该节点即可。

关于java - 使用特定 orderby 从包含多个子节点的 FireBase 数据库检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59010091/

相关文章:

java - gradle 依赖如何找到包?

Java 和 Kotlin 组合构建错误(Duplicate Zip Entry)

java - Android:继承的 View 比例

mysql - 5000万条数据的表,添加索引耗时太长

database - 什么是最好的灵活性,为什么?使用数据库 View 、数据库表、存储过程。和表中的对象

java - MVN编译不使用UTF-8编码

java - 将 KeyEvent 发布到焦点组件

android - radio 组对象在哪里

android - 如何在 fragment 中实现 ImageView 的 OnClickListener?

java - 如何在不使用 CAST 函数的情况下在连接级别以正确的格式 (CCSID 37) 转换 IBM DB2 十六进制数据