我正在一个方法中注册一个事件监听器。
public void listenForUpdates(){
final DocumentReference docRef = db.collection("teams").document(selectedTeam);
ListenerRegistration registration = docRef.addSnapshotListener(PokerActivity.this, new EventListener<DocumentSnapshot>() {
@Override
[snip]
//registration.remove();
}
然后用另一种方法,我必须从Firestore数据库中删除两个数组的完整性。
public void undoClicked(View view) {
db.collection("teams").document(selectedTeam).update("selectedCards", FieldValue.delete());
db.collection("teams").document(selectedTeam).update("players", FieldValue.delete());
我的问题是:
selectedCards
和players
数组时,事件监听器会引发空对象引用(至少我认为是原因)。2019-05-19 16:26:32.974 14243-14243/com.example.scrumpoker E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.scrumpoker, PID: 14243
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
at com.example.scrumpoker.PokerActivity$4.onEvent(PokerActivity.java:302)
at com.example.scrumpoker.PokerActivity$4.onEvent(PokerActivity.java:290)
at com.google.firebase.firestore.DocumentReference.lambda$addSnapshotListenerInternal$2(com.google.firebase:firebase-firestore@@18.2.0:515)
at com.google.firebase.firestore.DocumentReference$$Lambda$3.onEvent(Unknown Source:6)
at com.google.firebase.firestore.util.ExecutorEventListener.lambda$onEvent$0(com.google.firebase:firebase-firestore@@18.2.0:42)
at com.google.firebase.firestore.util.ExecutorEventListener$$Lambda$1.run(Unknown Source:6)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
registration.remove();
方法中为监听器启用了listenForUpdates()
,则我的应用程序将不会监视数据库中的更改。我似乎被困在一块石头和一块硬土地之间!
我如何拥有事件监听器,但是在删除数组之前将其禁用-而不尝试将我的所有代码放入一个方法中?
OR-如何清空数组而不将其从Firestore数据库中完全删除?
答案 0 :(得分:0)
在您的监听器中,您可以使用exists()
检查是否有数据,例如:
ListenerRegistration registration = docRef.addSnapshotListener(PokerActivity.this, new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(DocumentSnapshot documentSnapshot,
FirebaseFirestoreException e) {
if (documentSnapshot != null && documentSnapshot.exists()) {
Toast.makeText(PokerActivity.this, "Current data:" +
documentSnapshot.getData(), Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(PokerActivity.this,"no data", Toast.LENGTH_SHORT).show();
}
}
});
来自docs:
public boolean exists ()
返回 如果文档存在于此快照中,则为true。
答案 1 :(得分:0)
在方法外实例化ListenerRegistration registration;
变量,并在方法内更改registration.remove();
的范围。