Firestore根据条件执行删除操作。
Firestore perform delete based on condition的问题是,无论文档是否存在,删除方法始终返回onSucefful。
这个问题的原因是,在whereQueryDelete方法中,首先通过查询条件获取文档数据,然后删除文档。但是,删除文档的方法不会检查文档是否存在,而是始终返回成功。这意味着,即使文档不存在,也会返回成功。
为了解决这个问题,可以在删除文档之前先检查文档是否存在。可以使用exists()方法来检查文档是否存在,如果存在再进行删除操作。修改的代码如下:
public void whereQueryDelete(final String collection, final String field, final String value) { mFirestoreDatabase.collection(collection) .whereEqualTo(field, value) .get() .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { public void onComplete( Task<QuerySnapshot> task) { if (task.isSuccessful()) { for (QueryDocumentSnapshot document : task.getResult()) { Log.d(TAG, document.getId() + " => " + document.getData()); String idDelete = document.getId(); mFirestoreDatabase.collection(collection).document(idDelete) .get() .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() { public void onComplete( Task<DocumentSnapshot> task) { if (task.isSuccessful() && task.getResult().exists()) { mFirestoreDatabase.collection(collection).document(idDelete) .delete() .addOnSuccessListener(new OnSuccessListener<Void>() { public void onSuccess(Void aVoid) { Log.d(TAG, "DocumentSnapshot successfully deleted!"); } }) .addOnFailureListener(new OnFailureListener() { public void onFailure( Exception e) { Log.w(TAG, "Error deleting document", e); } }); } } }); } } else { Log.d(TAG, "Error getting documents: ", task.getException()); } } }); }
通过在删除文档之前先获取文档,然后检查文档是否存在,可以确保只有存在的文档才会被删除。这样就解决了Firestore perform delete based on condition的问题。
Firestore基于条件执行删除操作的原因是我们想要根据特定条件从Firebase Firestore数据库中删除文档。为了实现这一目标,我们需要创建所需的查询,然后使用delete()
方法执行删除操作。
以下是解决这个问题的方法:
1. 首先,我们需要创建一个查询对象query
,该对象使用whereEqualTo()
方法指定要匹配的字段和值。
2. 然后,我们使用query.get()
方法执行查询,并通过addOnCompleteListener()
方法监听查询结果。
3. 在查询结果返回后,我们遍历返回的文档列表,并使用itemsRef.document(document.getId()).delete()
方法删除每个文档。
4. 如果删除操作成功,我们可以显示一条成功的消息给用户。如果删除操作失败,我们可以记录错误信息。
以下是实现该功能的代码示例:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance(); CollectionReference itemsRef = rootRef.collection("yourCollection"); Query query = itemsRef.whereEqualTo("field1", "x").whereEqualTo("field2", "y"); query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { public void onComplete( Task<QuerySnapshot> task) { if (task.isSuccessful()) { for (DocumentSnapshot document : task.getResult()) { itemsRef.document(document.getId()).delete(); } } else { Log.d(TAG, "Error getting documents: ", task.getException()); } } });
另外,如果我们想要在所有删除操作完成后显示一条消息给用户,我们可以在每个delete()
方法后添加addOnCompleteListener()
方法,然后嵌套处理响应。
此外,我们还可以将所有删除操作添加到一个批处理batch
中,以提高效率。这样可以减少与服务器的通信次数。
希望这篇文章对你理解Firestore基于条件执行删除操作的原因和解决方法有所帮助。