为什么会出现此错误:java.lang.IollegalStateException:在调用commit()之后,写入批



下面的代码我正在尝试删除一个会员,应该删除一个成员及其详细信息和所有费用记录。

public void deleteMember(Member member) {
final WriteBatch batch = FirebaseFirestore.getInstance().batch();
DocumentReference memberDoc = getMemberReference().document(member.getMemberId());
batch.delete(memberDoc);
getFeeReference().whereEqualTo("id", member.getMemberId())
.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for(QueryDocumentSnapshot snapshot : queryDocumentSnapshots){
batch.delete(snapshot.getReference()); // this is the line of error
}
}
});
batch.commit();
getMemberImagesReference().child(member.getMemberId() + "t.jpg").delete();
getMemberImagesReference().child(member.getMemberId() + "f.jpg").delete();
}

但我收到以下错误

2020-04-10 22:57:33.462 29454-29454/com.abhinav.chauhan.gymdatamanager D/AndroidRuntime: Shutting 
down VM
2020-04-10 22:57:33.464 29454-29454/com.abhinav.chauhan.gymdatamanager E/AndroidRuntime: FATAL 
EXCEPTION: main
Process: com.abhinav.chauhan.gymdatamanager, PID: 29454
java.lang.IllegalStateException: A write batch can no longer be used after commit() has been called.
at com.google.firebase.firestore.WriteBatch.verifyNotCommitted(com.google.firebase:firebase- 
firestore@@21.4.2:202)
at com.google.firebase.firestore.WriteBatch.delete(com.google.firebase:firebase- 
firestore@@21.4.2:179)
at 
com.abhinav.chauhan.gymdatamanager.database.FireBaseHandler$1.onSuccess(FireBaseHandler.java:110)
at    
com.abhinav.chauhan.gymdatamanager.database.FireBaseHandler$1.onSuccess(FireBaseHandler.java:106)
at com.google.android.gms.tasks.zzn.run(Unknown Source:4)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:101)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7425)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

get()是异步的,并且在查询完成之前立即返回。在那之后,您的代码将继续提交带有单个删除的批处理。一段时间后,在get((完成后,代码将尝试在批处理完成后向其添加另一个删除。这就是为什么会出现错误的原因——调用commit()后无法再次修改批处理。

也许您应该等到回调被调用后,再添加所有要修改的文档并调用commit((,以确保commit()是在批处理中调用的最后一个方法。

最新更新