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()...?
});
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");
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());
}
});
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
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);
}
});
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.
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);
}
}
);