【问题标题】:how to access child of parent node without affecting other child in that same node?如何访问父节点的子节点而不影响同一节点中的其他子节点?
【发布时间】:2019-03-08 09:25:18
【问题描述】:

我已访问此用户节点的子节点。但是每次我尝试更新一个孩子的分数和分析时,其他孩子都会受到影响,导致另一个孩子具有相同的价值。

这是我用来访问用户下的孩子以获得分数的代码

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    Query query = rootRef.child("Users").orderByChild("username");

    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {        
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                    Map<String, Object> map = (Map<String, Object>) ds.getValue();
                    map.put("score", total);
                    ds.getRef().updateChildren(map);

            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.d("TAG", databaseError.getMessage());
        }
    };
    query.addListenerForSingleValueEvent(valueEventListener);

这是我用来访问用户下的子项以进行分析的代码

 DatabaseReference dr = FirebaseDatabase.getInstance().getReference();
        Query q = dr.child("Users").orderByChild("username");

        ValueEventListener vel = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot ds : dataSnapshot.getChildren()) {
                    Map<String, Object> map = (Map<String, Object>) ds.getValue();
                    map.put("analysis", sev);
                    ds.getRef().updateChildren(map);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d("TAG", databaseError.getMessage());
            }
        };
        q.addListenerForSingleValueEvent(vel);
    }

我必须在不影响其他孩子的情况下更新分析和评分

【问题讨论】:

  • 你从哪里得到这个值usersName(在线if(usersName == usersName){),它的目的是什么?
  • 那是错误的。我只是在尝试。那不应该在那里。

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


【解决方案1】:

使用equalTo(theusername) 指定您尝试获取访问更新的用户:

所以查询将是:

Query query = rootRef.child("Users").orderByChild("username").equalTo(theusername).child("score");

// 或analysis 而不是score

在你的听众中:

ValueEventListener vel = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot ds : dataSnapshot.getChildren()) {

                   // update the value here ...
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d("TAG", databaseError.getMessage());
            }
        };
        q.addListenerForSingleValueEvent(vel);

【讨论】:

  • 用户名? @Mohsen
  • But every time I try to update the score and analysis of one child 我这么说是因为你的这行。是的,如果您尝试更改特定用户的值,您可以指定用户的用户名或 UID,然后您就可以更改特定用户的值。
  • 它不应该是具体的。我不能使用 equalTo("Rona") 或 equalTo("Zillah")
  • 您到底想达到什么目的?仅适用于一个用户或?它实际上会影响那里的所有项目,因为这些字段是相同的,并且您对所有用户都做同样的事情。最好指定您要更新的用户字段。
  • 我必须先进入 Rona 或 Zillah 的领域。在它改变分数和分析之前。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多