没有连接时,不会调用插入/删除文档回调的Firestore数据库

时间:2017-12-12 11:02:05

标签: android firebase google-cloud-firestore

我在Android上尝试firestore数据库。

这是我插入文档的代码:

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)该问题已报告here,并已关闭。我不确定如何保证离线创建数据的正确性。

3 个答案:

答案 0 :(得分:0)

您的代码似乎没有任何问题,请尝试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$;

答案 1 :(得分:0)

好的,所以我做了一个简单的问题版本,但不是添加帖子,而是添加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());
                    }
                });
    });

}

运行此操作时,将断点放在onSuccessonComplete中。它们都被触发,我可以看到输出。

我从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. 如果这不起作用,请尝试执行firestore调用而不进行换行 它在一个可观察的
  3. 如果所有其他内容都可能是连接问题,因为您说它发生了 间歇

答案 2 :(得分:0)

我遇到了与本机反应。

对于插入,关键是创建一个新文档。

示例:

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

这将离线创建文档,并在您重新联机时进行同步。

诸如此类的其他呼叫将在离线状态下工作

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