Firestore EventListener вызывает нулевое исключение, когда я удаляю поля - PullRequest
0 голосов
/ 19 мая 2019

Я регистрирую прослушиватель событий внутри одного метода.

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. Когда я удаляю массивы 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)
  1. Но если я включу registration.remove(); для слушателя в моем методе listenForUpdates(), то мое приложение не будет отслеживать изменения в базе данных.

Кажется, я застрял между камнем и наковальней!

Как я могу получить прослушиватель событий, но затем отключить его перед удалением моих массивов - без попытки поместить весь мой код в один метод?

ИЛИ - Как я могу очистить свои массивы, не удаляя их полностью из базы данных Firestore?

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

Создание переменной ListenerRegistration registration; вне метода и изменение области действия registration.remove(); в методе.

0 голосов
/ 19 мая 2019

В вашем слушателе вы можете использовать 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();
      }
 }
});

Из документов :

public boolean exists ()

Возвращает true, если документ существовал в этом снимке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...