【问题标题】:firebase check if child existsfirebase 检查孩子是否存在
【发布时间】:2016-09-18 23:19:24
【问题描述】:

所以我的后端使用了 firebase。我的目标是将用户匹配添加到用户 ID。但是,当用户最初注册时,他们没有匹配项。我要做的是检查用户子项中是否存在“匹配”子项,如果不创建列表子项并存储第一个匹配项。但是,如果它已经存在,则只需添加匹配项。这是我的代码:

    public void setMatch(final String match){
    final Firebase ref = new Firebase("FIREBASEURL");
    final Firebase userRef = ref.child("Flights").child(userName);
    userRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            System.out.println("does the child exist? " + dataSnapshot.child("matches").exists());
            if(!dataSnapshot.child("matches").exists()){
                ArrayList<String> matches = new ArrayList<String>();
                matches.add(match);
                Firebase matchesRef = userRef.child("matches");
                matchesRef.setValue(matches);
                userRef.removeEventListener(this);
            }else if(dataSnapshot.child("matches").exists()){
                Map<String, Object> matches = new HashMap<>();
                matches.put("matches", match);
                userRef.child("matches").push().setValue(matches);
                userRef.removeEventListener(this);
            }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });
}

当前,该值被添加两次(如果字段已经存在,则调用 else if 两次/如果不存在则调用它)。我不确定我做错了什么。

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    这听起来很复杂。在 Firebase 数据库中,通常最好将读取和写入操作尽可能分开。虽然推送 ID 是按时间顺序存储数据的好方法;如果项目有一个自然键,通常最好将它们存储在该键下。

    例如,如果您的String match 确实是String matchId,则可以使用matchId 作为键来确保每个匹配项最多出现一次。

    userRef.child("matches").child(matchId).setValue(true);
    

    这个操作是幂等的:无论你多久运行一次,它都会给出相同的结果。

    您会注意到,我没有检查 matches 是否已存在:Firebase 数据库会自动创建存储值所需的所有节点,并自动删除其下没有值的所有节点。

    【讨论】:

      【解决方案2】:

      看起来,如果 if 块中不存在该字段,则您创建该字段,然后测试该字段(刚刚创建的)是否存在,现在确实存在,因此它再次添加它。 removeEventListener 调用将删除侦听器,但不会阻止当前代码完成。

      试试:

      if(!dataSnapshot.child("matches").exists()){
                  ArrayList<String> matches = new ArrayList<String>();
                  matches.add(match);
                  Firebase matchesRef = userRef.child("matches");
                  matchesRef.setValue(matches);
                  userRef.removeEventListener(this);
                  return; 
              }else if(dataSnapshot.child("matches").exists()){
                  Map<String, Object> matches = new HashMap<>();
                  matches.put("matches", match);
                  userRef.child("matches").push().setValue(matches);
                  userRef.removeEventListener(this);
              }
      

      添加返回语句应该完全是当前调用,并且仍然按照您的意图禁用监听器。

      【讨论】:

        猜你喜欢
        • 2016-09-20
        • 2017-02-25
        • 1970-01-01
        • 2017-10-24
        • 1970-01-01
        • 2022-01-15
        • 2019-09-15
        • 2011-11-25
        相关资源
        最近更新 更多