2017-11-29 1 views
2

ノードの1つのフィールドを更新する必要があります。つまり、 'schedule_id = 1'を持つ0/1に通知してください。多くの手順を試しましたが、更新できない場合もあります。Firebaseノードアップデート

Iはまた、この新しいノードに

Firebase構造を追加して(Update and delete data in 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" 
        } 
        } 
       } 
      } 
     } 
     } 
    } 
} 

。この場合 、デバッガが

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; 
    } 
} 

enter image description here

答えて

0

の代わりにあなたがのsetValueを使用することができますupdateChildren使用して「query.addListenerForSingleValueEvent`の内側に取​​得していないような問題が起こっていますメソッドを使用してschedule_idの値を設定しますが、まずは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) { 

          } 
         }); 

これはあなたを助けるかもしれません。

+0

イムないように注意してください私の参照が正しいかどうかは確かですが、方法は100%正しいです –

+0

より具体的にすることができます。スケジュールIDが '1'に等しいときに '通知'ノードを更新する必要があります –

0

getChildren()メソッドを使用している場合は、dataSnapshotオブジェクトを反復していることを意味します。これは、すべてのキーを取得していることを意味します。だから

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

あなたが新しいキーのために推進しているされていますpush()方法によって生成された特定のキーを使用できるようにするには、このコード行を使用してフィールドに最初にそれを格納する必要がありますあなたがそれを保管することができる瞬間。

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"); 
+0

サーバーからfirebaseノードが作成されました/ php end.My jobはアンドロイドエンドで自分の仕事が完了したときに通知ノードを更新することです –

+0

この場合、PHPサーバはあなたにアップデートをしなければならないキーを送るべきです。 'DatabaseReference'ではキーを知らなくてもそれを使うことはできません。文字通り知らないキーをデータベースに照会するだけでは意味がありません。 –

+0

ok私は確かにあなたにpingを試みてみましょう –