База данных 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.
- Из того, что я вижу с вашим, возможно, используйте
emitter
в вашемObservable.create
, - Если это не сработает, попробуйте позвонить в пожарный магазин, не оборачивая его в наблюдаемый
- Если все остальное, может быть проблема с подключением, так как вы говорите, что это происходит периодически
Я сталкивался с этим с реакцией родных.
Для вставок ключ заключается в создании нового документа.
пример:
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$;