In my app, I simply try to retrieve a reading passage from my Firebase
database by adding a ListenerForSingleValueEvent
in the following code:
Hope that my solution can help somebody else (I assume that you already did something else)
Besides to set the keepSynced
to true
in my database reference:
databaseRef.keepSynced(true)
And add to my Application class:
FirebaseDatabase.getInstance().setPersistenceEnabled(true)
I've added two listeners, one for offline mode and other one for online:
override fun create(data: BaseObject): Observable {
return Observable.create { observer ->
val objectId = databaseRef.push().key
objectId?.let { it ->
data.id = it
val valueEvent = object : ValueEventListener {
override fun onCancelled(e: DatabaseError) {
observer.onError(e.toException())
}
override fun onDataChange(dataSnapshot: DataSnapshot) {
observer.onComplete()
}
}
// This listener will be triggered if we try to push data without an internet connection
databaseRef.addListenerForSingleValueEvent(valueEvent)
// The following listeners will be triggered if we try to push data with an internet connection
databaseRef.child(it)
.setValue(data)
.addOnCompleteListener {
observer.onComplete()
// If we are at this point we don't need the previous listener
databaseRef.removeEventListener(valueEvent)
}
.addOnFailureListener { e ->
if (!observer.isDisposed) {
observer.onError(e)
}
databaseRef.removeEventListener(valueEvent)
}
} ?: observer.onError(FirebaseApiNotAvailableException("Cannot create new $reference Id"))
}
}
To be honest, I don't like the idea to attach two listeners very much, if somebody else has a better and elegant solution, please let me know, I have this code temporarily until I find something better.