【问题标题】:Firebase node updateFirebase 节点更新
【发布时间】:2017-11-29 12:16:11
【问题描述】:

我需要更新节点的单个字段,即通知具有 'schedule_id=1' 的 0/1。我尝试了很多程序,但有时无法更新。

我也尝试过这个解决方案,但失败了(Update and delete data in Firebase)这是添加一个新节点

Firebase 结构:

 {
   "schedule":{
      "21-11-2017":{
         "route":{
            "1":{
               "kid":{
                  "21":{
                     "-KzDdfZtds7rxwETF4oN":{
                        "color":"#B71C1C",
                        "delay_time":"45 mins delay",
                        "is_active":"0",
                        "msg":"Driver out of garage",
                        "notify":"dsds",
                        "real_time":"10:30 PM",
                        "schedule_id":"1",
                        "schedule_time":"5:00"
                     }
                  }
               }
            }
         }
      }
   }
}

我已经尝试过这段代码。 在这种情况下,问题正在发生,就像调试器没有进入 'query.addListenerForSingleValueEvent`

private void updatefirebsenode() {
        FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
        final DatabaseReference reference = firebaseDatabase.getReference();
        Query query = reference.child("schedule").child("21-11-2017").child("route").child("1").child("kid").child("21").orderByChild("schedule_id").equalTo("1");
///from this line debugger is exiting 
        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                DataSnapshot nodeDataSnapshot = dataSnapshot.getChildren().iterator().next();
                String key = nodeDataSnapshot.getKey(); // this key is `K1NRz9l5PU_0CFDtgXz`
                String path = "/" + dataSnapshot.getKey() + "/" + key;
                HashMap<String, Object> result = new HashMap<>();
                result.put("notify", "1");
                reference.child(path).updateChildren(result);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
              //  Logger.error(TAG, ">>> Error:" + "find onCancelled:" + databaseError);
            }
        });
    }

安排 POJO 类

public class Schedule {
    private String delay_time;
    private String is_active;
    private String real_time;
    private String schedule_id;
    private String schedule_time;
    private String color;
    private String noti_message;
    private String notify;
    private transient Context context;


    public Schedule(String notify) {
        this.notify = notify;
    }

    public Schedule() {
    }

    public String getDelay_time() {
        return delay_time;
    }

    public void setDelay_time(String delay_time) {
        this.delay_time = delay_time;
    }

    public String getIs_active() {
        return is_active;
    }

    public void setIs_active(String is_active) {
        this.is_active = is_active;
    }

    public String getReal_time() {
        return real_time;
    }

    public void setReal_time(String real_time) {
        this.real_time = real_time;
    }

    public String getSchedule_id() {
        return schedule_id;
    }

    public void setSchedule_id(String schedule_id) {
        this.schedule_id = schedule_id;
    }

    public String getSchedule_time() {
        return schedule_time;
    }

    public void setSchedule_time(String schedule_time) {
        this.schedule_time = schedule_time;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getNoti_message() {
        return noti_message;
    }

    public void setNoti_message(String noti_message) {
        this.noti_message = noti_message;
    }

    public String getNotify() {
        return notify;
    }

    public void setNotify(String notify) {
        this.notify = notify;
    }

    public Context getContext() {
        return context;
    }

    public void setContext(Context context) {
        this.context = context;
    }
}

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    您可以使用 setValue 方法来设置 schedule_id 的值,而不是使用 updateChildren,但首先您必须引用 schedule_id 节点。

       final DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference().child("schedule").child("21-11-2017").child("route").child("1").child("kid").child("21").orderByChild("schedule_id");
                            mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
                                @Override
                                public void onDataChange(DataSnapshot dataSnapshot) {
                                    String schedule_id =(String )dataSnapshot.getValue();
                                                                        mDatabase.setValue("setDesiredValueTo Schedule_id");
                                    Log.wtf("MYLOG", "onDataChange: schedule_id updated" );
                                }
    
                                @Override
                                public void onCancelled(DatabaseError databaseError) {
    
                                }
                            });
    

    我更新用户积分的例子:

    final DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference("Users").child(created_by_referalUsername).child("pointsTotal");
                            mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
                                @Override
                                public void onDataChange(DataSnapshot dataSnapshot) {
                                    String points =(String )dataSnapshot.getValue();
                                    int i  =Integer.valueOf(points);
                                    i +=250;
                                    mDatabase.setValue(i);
                                    Log.wtf("MYLOG", "onDataChange: points added to referal owner profile" );
                                }
    
                                @Override
                                public void onCancelled(DatabaseError databaseError) {
    
                                }
                            });
    

    这可能会对你有所帮助。

    【讨论】:

    • 我不确定我的参考是否正确,但方法是 100% 正确
    • 可以更具体一点。我的要求是当 schedule id 等于 '1' 时将 'notify' 节点更新为 0
    【解决方案2】:

    当您使用getChildren() 方法时,这意味着您正在迭代dataSnapshot 对象,这意味着您将获得所有键,而不仅仅是一个。为了能够使用由push() 方法生成的特定密钥,您需要先使用这行代码将其存储到一个字段中:

    String key = yourRef.push().getKey();
    

    因此,当您推动新密钥时,就是您可以存储它的时刻。

    为了更新 Firebase 数据库中某个字段的值,您不需要附加侦听器,您只能在引用上直接使用setValue() 方法,如下所示:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    rootRef.child("schedule")
        .child("21-11-2017")
        .child("route")
        .child("kid")
        .child("21")
        .child("-KzDdfZtds7rxwETF4oN")
        .child("notify")
        .setValue("1");
    

    【讨论】:

    • firebase 节点是从服务器/php 端创建的。我的工作是在 android 端完成我的工作后更新通知节点
    • 在这种情况下,php 服务器应该向您发送您必须进行更新的密钥。您不能在不知道的情况下使用 DatabaseReference 中的密钥,也不能简单地查询数据库以获取您根本不知道的密钥。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 2018-06-25
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多