web-dev-qa-db-fra.com

Mettre à jour des valeurs spécifiques à l'aide de Firebase pour Android

J'ai des données Firebase créées comme suit

tasks
-K1NRz9l5PU_0R8ltgXz
   Description: "test1"
   Status: "PENDING"
 -K1NRz9l5PU_0CFDtgXz
   Description: "test2"
   Status: "PENDING"

J'ai besoin de mettre à jour le statut du 2e objet de PENDING à COMPLETED. J'utilise la méthode updateChildren mais il est ajouté un nouveau nœud à l'enfant de tâches.

Comment mettre à jour le statut du 2ème nœud sans créer de nouveau nœud?

Voici mon code dès maintenant,

// sur un écouteur de clic de bouton

  {

    Firebase m_objFireBaseRef = new Firebase(AppConstants.FIREBASE_URL);        
    final Firebase objRef = m_objFireBaseRef.child("tasks");    
    Map<String,Object> taskMap = new HashMap<String,Object>();
    taskMap.put("Status", "COMPLETED");
    objRef.updateChildren(taskMap); //should I use setValue()...?

 });
15
Parth Doshi

Vous ne spécifiez pas l'ID de tâche de la tâche que vous souhaitez mettre à jour.

String taskId = "-K1NRz9l5PU_0CFDtgXz";

Firebase m_objFireBaseRef = new Firebase(AppConstants.FIREBASE_URL);        
Firebase objRef = m_objFireBaseRef.child("tasks");
Firebase taskRef = objRef.child(taskId);
Map<String,Object> taskMap = new HashMap<String,Object>();
taskMap.put("Status", "COMPLETED");
taskRef.updateChildren(taskMap);

Alternativement, vous pouvez simplement appeler setValue() sur la propriété que vous souhaitez mettre à jour

String taskId = "-K1NRz9l5PU_0CFDtgXz";

Firebase m_objFireBaseRef = new Firebase(AppConstants.FIREBASE_URL);        
Firebase objRef = m_objFireBaseRef.child("tasks");
Firebase taskRef = objRef.child(taskId);
Firebase statusRef = taskRef.child("Status");
statusRef.setValue("COMPLETED");

Ou:

Firebase m_objFireBaseRef = new Firebase(AppConstants.FIREBASE_URL);        
Firebase objRef = m_objFireBaseRef.child("tasks");
objRef.child(taskId).child("Status").setValue("COMPLETED");

Mise à jour

Je ne sais pas ce que signifie "J'ai besoin de suivre l'ID en fonction de l'état". Mais si vous souhaitez synchroniser toutes les tâches qui ont le statut Pending, vous feriez:

Firebase m_objFireBaseRef = new Firebase(AppConstants.FIREBASE_URL);        
Firebase objRef = m_objFireBaseRef.child("tasks");
Query pendingTasks = objRef.orderByChild("Status").equalTo("PENDING");
pendingTasks.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot tasksSnapshot) {
        for (DataSnapshot snapshot: tasksSnapshot.getChildren()) {
            snapshot.getRef().child("Status").setValue("COMPLETED");
        }
    }
    @Override
    public void onCancelled(FirebaseError firebaseError) {
        System.out.println("The read failed: " + firebaseError.getMessage());
    }
});
36
Frank van Puffelen

Vous pouvez utiliser le code ci-dessous pour mettre à jour

HashMap<String, Object> result = new HashMap<>();
        result.put("Description", "Your Description comes here");

FirebaseDatabase.getInstance().getReference().child("tasks").child("-K1NRz9l5PU_0R8ltgXz").updateChildren(result);

Il mettra à jour un enfant spécifique

6
Praveen

Ce code trouvera le contenu du nœud test2, puis mettez à jour le statut. J'espère que cette aide. J'utilise Google Firebase.

FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
    final DatabaseReference reference = firebaseDatabase.getReference();
    Query query = reference.child("tasks").orderByChild("Description").equalTo("test2");
    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("Status", "COMPLETED");
            reference.child(path).updateChildren(result);
        }

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

        }
    });
5
Son Nguyen Thanh

Vous ne nous aidez pas ... nous essayons de savoir quelle fonction peut nous aider à obtenir la clé afin que les mises à jour puissent être automatiquement sans comparer aucune valeur. Suis à la recherche s'il y a un chemin je vous ferai savoir PERTH

Log.e(TAG, "Key2 is "+getRef(position).getKey());

Veuillez utiliser firebase Ui Semble que la base de feu d'origine n'a pas encore.

2
Goodlife

Vous avez juste besoin d'obtenir la bonne valeur de clé à partir de la méthode Push, puis de mettre à jour les enfants lorsque votre tâche est terminée par addOnCompleteListener

MyTaskModel myTaskModel = new MyTaskModel();
myTaskModel.Description = "My Text Is Here";
myTaskModel.Status = "PENDING";
        final FirebaseDatabase mFirebaseDatabase = FirebaseDatabase.getInstance();
        final DatabaseReference databaseReference = mFirebaseDatabase.getReference().child("tasks");
        final DatabaseReference dbr= databaseReference.Push();
        final String key = dbr.getKey();
        Task task1 = dbr.setValue(myTaskModel);
        task1.addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {

                                     Map<String, Object> taskMap = new HashMap<String, Object>();
                                     taskMap.put("Status", "COMPLETED");                  
                                     FirebaseDatabase.getInstance().getReference().child("tasks").child(key).updateChildren(taskMap);

                                    }
                                }
                            );