14

これは概念的な問題であり、必ずしも特定のテクノロジーに限定されるものではありません。サーバー上にデータベースがあり、そのデータベースのコンテンツにアクセスするためのREST / JSON APIがあり、APIを介して取得したデータを表示するモバイルクライアントがあるとします。

クライアントに何らかのキャッシュメカニズムがあり、クライアントが読み取りのみを行っている限り、データへのオフラインアクセスを有効にできると便利です(私の場合、管理する必要がないように、オフラインクライアントへの書き込みアクセスを拒否するのは問題ありません)。発生する可能性のあるすべての厄介な競合)。

これを解決する良い方法は、サーバーデータベースモデルのサブセットをクライアントに存在させ、サーバーからクライアントにデータを同期することであるように思われます。ローカルデータベースにアクセスすると、すぐに結果が返されるだけでなく、サーバーへの更新要求もトリガーされる可能性があります。サーバーが変更されたデータを返す場合、クライアントモデルはローカルデータベースを同期し、データの変更を表示に通知します。

もちろん、最終的な目標は、ユーザーがインターネット接続の安定性に関係なく情報を閲覧できることであり、データを変更しない限り、接続ダイアログなどに煩わされることはありません。

実装の観点からすると...一方では、サーバーデータベースをクライアントデータベースに直接結合することは悪い考えのように思われます。それらは異なるベンダーのものである可能性があるからです。少なくとも、両方のデータベース実装の上にベンダーに依存しないモデルが必要になると思います。一方、サーバーデータベースからのデータを何らかのトランスポート形式に変換し、それをクライアントデータベースに戻すよりも、多くのオーバーヘッドのように思われます。

エレガントでメンテナンス可能な方法でそれを解決する方法の提案はありますか?

4

2 に答える 2

10

大規模なデータベースのごく一部をローカルで受話器に同期するアプリに取り組んでいます。受話器で発生する必要のある初期プリロードがありますが、その後、更新はバックグラウンドで非同期的に発生します。

まず、JSONまたはXMLを使用してサーバーと受話器を分離することを強くお勧めします。プラットフォームに関係なく同じテクノロジーを使用せざるを得ないため、1つのテクノロジーに固定すると常に問題が発生します。つまり、他のプラットフォーム(Web、iOSなど)への拡張を計画している場合は、サーバーによって指定された形式を使用する必要があります。一般的な形式を選択すると、長期的にはそれが簡単になります。実際には、JSONの読み取り/書き込みを行う公共図書館の数は、些細なことです。

データを同期するために使用する方法は2つあります。

1.AlarmManager

定期的なスケジュール(たとえば6時間ごと)でウェイクアップするサービスをトリガーするようにAlarmManagerをスケジュールします。ウェイクアップは、サーバーに接続するバックグラウンドサービスを開始し、JSONの変更をダウンロードして、ローカルのSQLiteDBを更新します。接続がない場合、更新はスキップされ、次のウェイクアップがスケジュールされます。接続が復元されたときに同期を自動的に再開するConnectivityChangedレシーバーを追加します。

2. GCM

少し手間がかかりますが、変更があったときにのみローカルデータベースを更新すると、バッテリーとデータの使用量を大幅に節約できます。Google Cloud Messagingは、ウェイクアップメッセージをデバイスに送信し、同期サービスを開始するようにデバイスに指示できます。同期サービスは、上記のAlarmManagerメソッドと同じように実行されます。

データがどれだけ「新鮮」であるか、およびデータがどのくらいの頻度で変更されるかに応じて、上記の両方の方法を組み合わせて実行します。RSSフィードのようなものはおそらく30分ごとに更新する必要がありますが、気象データは4時間ごとに更新する必要がない場合があります。

したがって、データベース同期を実行するために使用します。

受信者->システムイベントをリッスンし、サービスサービスをトリガーします->サーバーに接続し、JSONをダウンロードしてSQLiteプロバイダープロバイダーを更新します->レコードをデータベースに挿入し、コンテンツの変更をContentObserversContentObserversにブロードキャストします->アプリの実行時にContentObserversはUIを新しいデータで更新します

上記の各コンポーネントには多くの技術的な詳細がありますが、サーバーデータをローカルデータベースと同期するための非常に堅牢なアーキテクチャを提供するはずです。

于 2013-01-24T20:48:11.483 に答える
5

私は同様の要件を持つプロジェクトに取り組んでいます。どこかのサーバーに大規模で利用可能なデータベースを置き、そこからデータを取得するモバイルデバイスを用意したいと考えています。デバイスがオフラインになっても、データの独自のコピーをローカルに保存しているので問題ありません。

サーバーテクノロジーとしてBigCouch(クラスタリングをサポートするApache CouchDbのフォーク)を使用し、次にモバイルデバイスでCouchbaseMobileを使用することにしました。(注として、Android用のTouchDBはCouchbase Mobileに取って代わりますが、まだ安定していません。)

Couch *テクノロジーを採用した理由は、CouchがHTTP上で優れたレプリケーションを備えているためです。プログラムでモバイルデバイスで同期イベントを開始すると、すべての挿入、更新、削除が複製されます。情報をモバイルデバイスに埋め込まれた独自のCouchDbに保存するため、オフラインで読み取ることができます。

Couchの道を進みたくない場合は、SQLliteなどを使用してREST/API呼び出しの結果を保存できます。次に、モバイルデバイスがオフラインになってから戻ってきたときのために、独自のレプリケーションロジックを作成する必要があります。これを行うための創造的な方法があるので、多分それはオプションです。

于 2013-01-18T17:38:34.203 に答える