Se sua estrutura do Firebase não for muito complexa, você também pode criar uma interface que defina métodos como
void addData(Data data);
Data getData(long id);
void editData(Data data, long id);
void deleteData(long id);
em seguida, crie 2 classes implementando essa interface, uma usando Firebase e outra usando SQLite.
DatabaseImplementation
FirebaseImplementation
Dentro da implementação do Firebase, você publica os dados normalmente e publica um novo nó em algo como
root/requestUpdate/userId/push/
e push conteriam informações sobre onde você solicita uma atualização e qual deviceId publicou. Em seguida, tenha um ValueEventListener vinculado a esse nó mencionado e, se ele obtiver um novo filho, verifique se o deviceId é o mesmo ou não. Se não for, tenha o FirebaseImplementation obterDados usando as informações que você obteve e, em seguida, use a DatabaseImplementation , para adicionarDados .
Isso garantiria que, sempre que uma alteração fosse feita, qualquer outro cliente conectado saberia atualizar sua base de fogo. Se o cliente não estiver online, na próxima vez que ele estiver online, ele fará isso conforme o ValueEventListener aciona quando é anexado. Certifique-se de percorrer todas as atualizações solicitadas para garantir que todas sejam feitas. Também armazene as chaves de todas as atualizações que você concluiu em um banco de dados local para que você não acabe atualizando mais de uma vez.
Basicamente, o firebase estará sempre atualizado e armazenará todas as alterações feitas por um usuário em um nó separado que é ouvido por todos os clientes.
Obviamente, esta solução ainda tem muitos problemas que você precisaria corrigir, como descobrir quando excluir o nó requestUpdate. Logicamente após cada usuário ter sincronizado, mas como você determina isso? ...
Quanto ao primeiro login, você precisaria escrever um populateDatabaseFromFirebase() método que fará um monte de getDatas e addDatas. Como você faria isso dependerá da aparência do seu banco de dados. Você então armazenaria que o usuário já fez login com SharedPreferences e o UID do Firebase .
Dito isso, isso só funcionará se sua base de fogo for bastante plana. Se você tem um banco de dados complexo, tudo se torna muito mais complicado e emaranhado e pode valer a pena procurar em uma biblioteca externa.