Firebaseの構造がそれほど複雑でない場合は、
のようなメソッドを定義するインターフェースを作成することもできます。void addData(Data data);
Data getData(long id);
void editData(Data data, long id);
void deleteData(long id);
次に、そのインターフェースを実装する2つのクラスを作成します。1つはFirebaseを使用し、もう1つはSQLiteを使用します。
DatabaseImplementation
FirebaseImplementation
Firebase実装内では、通常のようにデータを公開し、1つの新しいノードをroot/requestUpdate/userId/push/
のようなものに公開します。 プッシュには、場所に関する情報が含まれます 更新をリクエストし、 deviceId 公開しました。
次に、ValueEventListenerをその言及されたノードに関連付け、新しい子を取得した場合は、deviceIdが同じかどうかを確認します。そうでない場合は、 FirebaseImplementationを使用してください getData 取得した情報を使用してから、 DatabaseImplementationを使用します 、 addData 。
これにより、変更が加えられるたびに、ログインしている他のクライアントがFirebaseを更新することを認識できるようになります。クライアントがオンラインでない場合は、次にオンラインになるときに、接続時にValueEventListenerがトリガーされるときにクライアントがそれを実行します。要求されたすべての更新をループして、すべてが行われたことを確認してください。また、完了した更新のプッシュキーをローカルデータベースに保存して、複数回更新しないようにします。
基本的に、Firebaseは常に最新であり、すべてのクライアントがリッスンしている別のノードでユーザーが行った変更を保存します。
明らかに、このソリューションには、requestUpdateノードをいつ削除するかを判断するなど、修正する必要のある多くの問題がまだあります。論理的にはすべてのユーザーが同期した後ですが、これをどのように判断しますか? ...
最初のログインについては、 populateDatabaseFromFirebase()を作成する必要があります。 大量のgetDatasとaddDatasを実行するメソッド。それをどのように行うかは、DBの外観によって異なります。次に、ユーザーが SharedPreferencesですでにログインしていることを保存します。 およびFirebaseUID 。
とはいえ、これはFirebaseがかなりフラットな場合にのみ機能します。複雑なデータベースがある場合は、すべてがはるかに複雑になり、絡み合っているため、外部ライブラリを調べる価値があるかもしれません。