2017-11-29 8 views
2

Ich muss ein einzelnes Feld des Knotens aktualisieren, d. H. Benachrichtigen Sie 0/1 mit 'Schedule_ID = 1'. Ich habe eine Menge Prozeduren ausprobiert, aber nicht in der Lage zu aktualisieren oder manchmal.Firebase Knoten Update

Ich habe auch diese Lösung versucht, aber scheiterte (Update and delete data in Firebase) diese einen neuen Knoten

Firebase Struktur wird ergänzt:

{ 
    "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" 
        } 
        } 
       } 
      } 
     } 
     } 
    } 
} 

habe ich versucht, diesen Code. In diesem Fall geschieht Problem wie der Debugger nicht in ‚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); 
      } 
     }); 
    } 

Schedule POJO Klasse

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

Antwort

0

Statt mit updateChildren Sie setValue verwenden können, wird immer Methode, um den Wert von schedule_id zu setzen, aber zuerst müssen Sie Bezug auf Schedule_id-Knoten haben.

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) { 

          } 
         }); 

mein Beispiel Benutzer Punkte zu aktualisieren:

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) { 

          } 
         }); 

diese Ihnen helfen können.

+0

im nicht sicher, entweder meine Referenz ist korrekt oder nicht, aber die Methode ist 100% korrekt –

+0

Kann spezifischer sein.Meine Anforderung ist, den Knoten 'notify' auf 0 zu aktualisieren, wenn die Zeitplan-ID gleich '1' ist –

0

Wenn Sie die Methode getChildren() verwenden, bedeutet dies, dass Sie das Objekt dataSnapshot durchlaufen, was bedeutet, dass Sie alle Schlüssel erhalten und nicht nur einen. Um einen bestimmten Schlüssel zu verwenden, die durch die push() Methode erzeugt wird, müssen Sie es speichern, zuerst in ein Feld mit dieser Codezeile:

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

Also, wenn Sie für einen neuen Schlüssel drängen, werden die Moment, in dem Sie es speichern können.

Um einen Wert eines Feldes in einer Firebase-Datenbank zu aktualisieren, brauchen Sie nicht einen Zuhörer zu befestigen, müssen Sie nur setValue() Methode direkt auf dem Referenz wie diese verwenden:

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

der Firebase-Knoten wird vom Server erstellt/php end.Mein Job ist es, den notify-Knoten zu aktualisieren, wenn mein Auftrag im android-Ende erledigt ist. –

+0

In diesem Fall sollte der PHP-Server Ihnen den Schlüssel senden, für den Sie das Update durchführen müssen. Sie können keinen Schlüssel in Ihrer 'DatabaseReference' verwenden, ohne es zu wissen, und Sie können Ihre Datenbank nicht einfach nach einem Schlüssel abfragen, den Sie wirklich nicht kennen. –

+0

ok lass mich versuchen, ich werde dich sicherlich anpingen –