Fusionner plusieurs requêtes Firestore localement peut être un défi, en particulier lorsque l'on tente de maintenir le bon ordre des résultats. Voici un guide complet pour fusionner efficacement des requêtes tout en préservant l'ordre des documents :
Pour fusionner deux requêtes et conserver l'ordre de leurs résultats, pensez à utiliser la méthode whenAllSuccess() de la classe Tasks :
FirebaseFirestore rootRef = FirebaseFirestore.getInstance(); Query firstQuery = rootRef... Query secondQuery = rootRef... Task firstTask = firstQuery.get(); Task secondTask = secondQuery.get(); Task combinedTask = Tasks.whenAllSuccess(firstTask, secondTask).addOnSuccessListener(new OnSuccessListener<List<Object>>() { @Override public void onSuccess(List<Object> list) { // Iterate over the list to access the merged results in the order of the tasks } });
La méthode whenAllSuccess() renvoie une seule tâche qui s'est terminée avec succès lorsque tous les éléments fournis les tâches ont réussi. Dans ce cas, le paramètre list contient une liste de listes d'instantanés où chaque élément correspond à l'ordre des requêtes.
Une autre option pour fusionner les requêtes consiste à utiliser la méthode continueWith(), qui permet d'enchaîner des tâches entre elles :
firstQuery.get().continueWith(new Continuation<QuerySnapshot, Object>() { @Override public Object then(@NonNull Task<QuerySnapshot> task) throws Exception { QuerySnapshot firstResults = task.getResult(); // Perform any additional necessary operations with the first results // Execute the second query and chain it to the continuation return secondQuery.get().continueWith(new Continuation<QuerySnapshot, Object>() { @Override public Object then(@NonNull Task<QuerySnapshot> task) throws Exception { QuerySnapshot secondResults = task.getResult(); List<DocumentSnapshot> mergedResults = new ArrayList<>(); mergedResults.addAll(firstResults.getDocuments()); mergedResults.addAll(secondResults.getDocuments()); // Return the merged results return mergedResults; } }); } }).addOnSuccessListener(new OnSuccessListener<Object>() { @Override public void onSuccess(Object result) { // Cast the result to a List<DocumentSnapshot> and access the merged results } });
Dans cet exemple, les résultats de la première requête sont obtenus et toutes les opérations nécessaires sont effectuées. Ensuite, la deuxième requête est exécutée et les résultats sont fusionnés avec le premier ensemble de résultats.
Les deux approches peuvent avoir un impact différent sur les performances de votre application. whenAllSuccess() exécute toutes les requêtes simultanément, ce qui peut être plus efficace si les deux requêtes ont des profils de performances similaires. continueWith() exécute les requêtes de manière séquentielle, ce qui peut être bénéfique si une requête est nettement plus lente que l'autre. En fin de compte, la meilleure approche dépend des exigences spécifiques de votre cas d'utilisation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!