База данных Firestore для вставки / удаления обратных вызовов документа, не вызываемых, когда нет соединения

Я пробую базу данных firestore на Android.

Это мой код, который вставляет документ:

public Observable<Post> createPost(final Post post){


        return Observable.create(new Observable.OnSubscribe<Post>() {
            @Override
            public void call(final Subscriber<? super Post> subscriber) {

                try{

                    DocumentReference documentReference = getCollection().document();

                    post.setId(documentReference.getId());
                    documentReference.set(post).addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {

                            subscriber.onNext(post);
                            subscriber.onCompleted();

                        }
                    }).addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            subscriber.onError(e);
                            subscriber.onCompleted();
                        }
                    });


                }catch (Exception ex){

                    subscriber.onError(ex);

                    Log.e(LOG_TAG, ex.getMessage(), ex);

                }

            }
        });


    }

Документ вставляется в базу данных, но ни обратные вызовы onSuccess, ни onFailure не вызываются.

Обновление 1


1) Проблема не согласована, иногда она работает, иногда обратные вызовы вызываются через час, иногда через 3 часа и т. Д.

2) Это происходит, когда нет подключения к интернету.

Обновление 2

1) О проблеме сообщили здесь и она закрыта. Я не уверен, как гарантировать правильность данных, созданных в автономном режиме.

3 ответа

Итак, я сделал простую версию вашего вопроса, но вместо добавления сообщения, он добавляет User, Концепция такая же.

Вот способ добавить пользователя. Возвращает Observable<DocumentReference> просто для ссылки, где пользователь был добавлен.

public  Observable<DocumentReference> insertToFirebaseFirestore$() {
    UserEntity userEntity = new UserEntity();
    userEntity.setEmail("myemail@myemail.com");
    userEntity.setBio("I'm a cool cat!");
    userEntity.setDisplayName("KoolKat!");

//Notice here I am using an ObservableEmitter instead of Subscriber like you did
    return Observable.create((ObservableEmitter<DocumentReference> emitter) -> {
        this.firebaseFirestore.collection("tempUsers")
                .add(userEntity)
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        emitter.onError(e);
                    }
                })
                .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                    @Override
                    public void onSuccess(DocumentReference documentReference) {
//this gets triggered when I run
                        emitter.onNext(documentReference);
                    }
                })
                .addOnCompleteListener(new OnCompleteListener<DocumentReference>() {
                    @Override
                    public void onComplete(@NonNull Task<DocumentReference> task) {
//this also gets triggered when I run
                        emitter.onNext(task.getResult());
                    }
                });
    });

}

Когда я запускаю это, и размещаю точки останова внутри onSuccess а также onComplete, Они оба сработали, и я вижу результат.

Я вызываю метод из Activity следующим образом.

...onCreate method
insertToFirebaseFirestore$()
        .subscribeOn(Schedulers.io())
        .observeOn(Schedulers.io()) //observe on io thread cause I don't need it to updateUI.
        .subscribe((DocumentReference val) ->{
            Log.e("USERACTIVITY", "You have uploaded " + val.getId());
        });

LogcatPrints

12-13 09:47:47.942 15007-15059/com.example.debug E/USERACTIVITY: You have uploaded sFBsF4ZmwGaDdxCEKuF6
12-13 09:47:57.563 15007-15059/com.example.debug E/USERACTIVITY: You have uploaded sFBsF4ZmwGaDdxCEKuF6.
  1. Из того, что я вижу с вашим, возможно, используйте emitter в вашем Observable.create,
  2. Если это не сработает, попробуйте позвонить в пожарный магазин, не оборачивая его в наблюдаемый
  3. Если все остальное, может быть проблема с подключением, так как вы говорите, что это происходит периодически

Я сталкивался с этим с реакцией родных.

Для вставок ключ заключается в создании нового документа.

пример:

const userRef = firebase.firestore()
                  .collection("users")
                  .doc();
userRef.set({name: someName});

Это создаст документ в автономном режиме и синхронизировать, когда вы вернетесь в онлайн.

Другие звонки, подобные этой, будут работать в автономном режиме.

userRef.collection("Locations").add({location: "Austin,TX"});

В вашем коде нет ничего плохого, попробуйте onCompleteListener Перезвоните. Так добавь

.addOnCompleteListener((Task<Void> task) -> {
                    if(task.getException() != null) {
                        emitter.onError(task.getException());
                    }
                    if(task.isComplete()) { //try task.isSuccessful() if this is what you are looking for
                        emitter.onComplete();
                    }
                });

Если это не решит вашу проблему, возможно, используйте излучатель так:

Completable completable$ = Completable.create((CompletableEmitter emitter) -> {
    firebaseFirestore.collection(collection).document(document)
        .delete()
        .addOnSuccessListener((Void aVoid) -> emitter.onComplete())
        .addOnFailureListener((Exception e) -> emitter.onError(e))
        .addOnCompleteListener((Task<Void> task) -> {
            if(task.getException() != null) {
                emitter.onError(task.getException());
            }
            if(task.isComplete()) { //try task.isSuccessful()
                emitter.onComplete();
            }
        });
});
return completable$;
Другие вопросы по тегам