Hi Dennis
PouchDb seems to be JavaScript specific, so it's not really an option on Android. Apache CouchDb is apparently build using Erlang, and even though there's a Java API it wont run on Android either, as far as I can see. But Couchbase maintains a somewhat similar almost-clone for Android here:
https://github.com/couchbase/couchbase-lite-android
The documentation for Couchbase is nowhere near as good and as easy to read as the documentation for Firebase. Really, the clear, well-structured documentation for Firebase was one of the main reasons I was attracted to Firebase to begin with. Still, with Couchbase being a noSQL database it has much more in common with Firebase than SQLite, and it does indeed offer an offline "local data only" mode. Using Couchbase to store offline data and Firebase for online (user authenticated) data seems feasible.
These are my options, as I see them:
1) Continue to store local data in SQLite until user has signed in and then switch to Firebase. I can make this dual storage strategy easier by changing my SQLite tables to mimic a noSQL database - i.e. just one or two tables storing JSON with unique strings as "document keys." Then write a thin data access layer on top of SQLite and Firebase that takes the cursors from SQLite and the callbacks from Firebase and transforms them into my custom, domain specific callbacks.
2) Use Couchbase for local storage and Firebase for cloud storage. I still need my thin data access layer and still need to capture the callbacks from both Couchbase and Firebase and transform them to conform to a unified callback interface. But the data access layer will probably be thinner and hopefully a bit easier to write when using noSQL for both types of storage. On the other hand, I'll end up with two dependencies in my app and have to maintain code for two similar but (most likely) subtly different technologies.
3) HACK Firebase: Generate a dummy email address and a password using a random UUID when the app is first launched, store these in a local, app-private file. If the user opt-out of the oboarding then authenticate with Firebase using the dummy values. This is not very secure and it just seems dishonest to sync data to the cloud even when the user has opted out of the onboarding. Also, it requires an internet connection for creating the initial dummy email user, and also for syncing once in a while so as not to degrade the offline performance.
4) Drop Firebase and go all-in with Couchbase instead. The great strengths of Firebase is the superb documentation, simple API and the fully hosted backend (with a simple pricing model!). Couchbase seems more complicated overall and less well documented by contrast - and I have to deal with hosting the database and sync gateway myself. But I can deal with it in two steps: Change my app to use Couchbase as local storage in place of SQLite and release a new version of my app relatively quickly; then for the next version I can set up a Cloudbase backend, add optional sign-in/onboarding in my app, and start a sync with the backend if and only if the user completed the new onboarding.
Right now I'm leaning mostly towards option 4.