当我删除字段时,Firestore EventListener会导致Null异常

时间:2019-05-19 15:22:44

标签: java android firebase google-cloud-firestore event-listener

我正在一个方法中注册一个事件监听器。

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());

我的问题是:

  1. 当我删除selectedCardsplayers数组时,事件监听器会引发空对象引用(至少我认为是原因)。
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)
  1. 但是,如果我在registration.remove();方法中为监听器启用了listenForUpdates(),则我的应用程序将不会监视数据库中的更改。

我似乎被困在一块石头和一块硬土地之间!

我如何拥有事件监听器,但是在删除数组之前将其禁用-而不尝试将我的所有代码放入一个方法中?

OR-如何清空数组而不将其从Firestore数据库中完全删除?

2 个答案:

答案 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();的范围。