【问题标题】:Retrieving data from FireBase Database containing multiple subnodes using a specific orderby使用特定 orderby 从包含多个子节点的 FireBase 数据库中检索数据
【发布时间】:2020-03-19 11:04:32
【问题描述】:

我一直在尝试在不知道“蓝色”键值的情况下检索“红色”数据(假设有多个带有随机键的孩子),但我想不出合适的代码。 这是 Firebase 子树。

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

 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 等于 2fddf71-4346-4395-bee5-38db04d4fd47 它允许我选择一个特定的孩子,这是第二个一个。

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

【问题讨论】:

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


    【解决方案1】:

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


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

    在快照上调用 getValue() 会返回数据的 Java 对象表示。如果该位置不存在数据,则调用 getValue() 将返回 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();
    

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

    【讨论】:

      【解决方案2】:

      所以我发现这对我有用

      DatabaseStage = FirebaseDatabase.getInstance().getReference("Stages").child(stageid).child("userEtudList");
      DatabaseStage.addValueEventListener(new ValueEventListener() {
              @Override
              public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                  mData.clear();
                  for(DataSnapshot data:dataSnapshot.getChildren()){
                      mData.add(data);
      

      【讨论】:

      • 确实,这是最简单的方法,因为对象键确实与uniqueId 相同。这就是为什么包含数据库的 JSON 而不是屏幕截图的最佳实践 - 您的屏幕截图仅显示了 uniqueId 的截断值。很高兴它为你工作。
      【解决方案3】:

      Firebase 数据库查询最多可以有一个未知键。因此,除非您知道0 键的2fded...fd47 键,否则无法查找您已标记为红色的特定节点。

      【讨论】:

      • 我找到了一种删除 orderBy 的方法,所以不需要使用 query ,我不能直接在 hashmap 或列表中检索“userEtudList”吗?
      猜你喜欢
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多