272

Androidアプリとサーバー間でデータ(dbレコード、メディアなど)を同期したい。あなたがEvernoteまたは同様のアプリケーションを見たことがあるなら、あなたは確かに私が何を意味するかを理解しています。

いくつか質問があります(DBレコードを同期したいとします):

  1. すべてのユーザーは、自分用のサーバースペースの一部(EvernoteまたはなどDropbox)を持っています。たぶん、ユーザーは携帯電話で新しいレコードを作成し、サーバーで新しいレコードを作成します。これらのレコードを一致させるにはどうすればよいですか?同じIDのレコードがある場合、どのアルゴリズムを提案しますか?

  2. JSONを除いて、携帯電話デバイスとサーバー間でデータを送信する方法はありますか?

  3. SyncAdapterContentProviderが私の問題を解決できる場合は、正確に説明してください。(サンプルやチュートリアルを私に提供していただければ、または私の検索を広げたりガイドしたりするのに役立つアドバイスやキーワードもいただければ幸いです)。

4

9 に答える 9

312

より大きな質問に対処することで、すべての質問に答えようとします。WebサーバーとAndroidアプリの間でデータを同期するにはどうすればよいですか?


ウェブサーバーとAndroidアプリの間でデータを同期するには、Androidデバイスにいくつかの異なるコンポーネントが必要です。

永続ストレージ:

これは、携帯電話がWebサーバーから受信したデータを実際に保存する方法です。これを実現するための1つの可能な方法は、Sqliteデータベースに基づく独自のカスタムContentProviderを作成することです。コンテンツプロバイダーのためのまともなチュートリアルはここで見つけることができます:http://thinkandroid.wordpress.com/2010/01/13/writing-your-own-contentprovider/

ContentProviderは、保存されたデータと対話するための一貫したインターフェースを定義しますまた、必要に応じて、他のアプリケーションがデータを操作できるようにすることもできます。ContentProviderの背後には、Sqliteデータベース、キャッシュ、または任意のストレージメカニズムがあります。

SqliteデータベースでContentProviderを使用することをお勧めしますが、任意のJavaベースのストレージメカニズムを使用できます。

データ交換フォーマット:

これは、ウェブサーバーとAndroidアプリの間でデータを送信するために使用する形式です。最近最も人気のある2つの形式は、XMLとJSONです。フォーマットを選択するときは、どのような種類のシリアル化ライブラリが利用できるかを考える必要があります。XML用に同様のライブラリが存在することは確かですが、gsonと呼ばれるjsonシリアル化用の素晴らしいライブラリがあることを知っています:https ://github.com/google/gson。

同期サービス

サーバーから新しいデータを取得し、サーバーのコンテンツを反映するようにモバイルコンテンツを更新できる、ある種の非同期タスクが必要になります。また、コンテンツにローカルな変更を加え、それらの変更を反映したい場合は、サーバーに通知する必要があります。Androidは、このパターンを簡単に解決する方法としてSyncAdapterパターンを提供しています。ユーザーアカウントを登録する必要があります。そうすれば、Androidが多くの魔法を実行し、自動的に同期できるようになります。これが良いチュートリアルです:http ://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/


レコードが同じであるかどうかを識別する方法については、通常、Androidデバイスとサーバーの両方に保存する一意のIDでアイテムを作成します。これを使用して、同じ参照を参照していることを確認できます。さらに、「updated_at」などの列属性を保存して、常に最新のデータを取得したり、新しく書き込まれたデータを誤って上書きしたりしないようにすることができます。

于 2012-07-07T01:38:43.273 に答える
61

今日を考えると、受け入れられた答えは古すぎます。私たちが知っているように、このタイプのアプリケーションを作成するのに役立つ多くの新しいライブラリがあります。

あなたは確かにあなたを助けるであろう以下のトピックを学ぶべきです:

そして、データベースの同期ロジックは次のようになります。AndroidフォンのSQLiteデータベースをサーバーのMySQLデータベースと同期する方法は?

すべての新しい学習者に最高の幸運を。:)

于 2016-04-25T04:58:03.157 に答える
24

これを自分で書く場合、これらは覚えておくべきいくつかのポイントです

デバイスと同期サーバー間の適切な認証

デバイスとサーバー間の同期プロトコル。通常、認証、データ交換、ステータス交換(どの操作が機能し、どの操作が失敗したか)の3つのフェーズで行われます。

ペイロード形式を選択します。実際のデータを表すために、JSONベースの形式と混合したSyncMLベースのXMLをお勧めします。したがって、プロトコルにはSyncMLを使用し、交換される実際のデータにはJSONを使用します。JSON配列を使用してデータにアクセスするのは簡単なので、データの操作中にJSON配列を使用することを常にお勧めします。

クライアントとサーバーの両方でデータの変更を追跡します。同期セッション中に変更および取得するIDの変更ログを維持できます。また、オブジェクトが正常に同期されたら、変更ログをクリアします。ブール変数を使用して、同期ステータス、つまり最後の同期を確認することもできます。エンドユーザーが最後の同期が行われた時刻を特定するのに役立ちます。

サーバー上のデータが変更されたときに同期セッションを開始するには、サーバーからデバイスに通信する方法が必要です。C2DMを使用するか、独自の永続的なtcpベースの通信を作成できます。tcpアプローチは非常にシームレスです

複数のデバイス間でデータの変更を複製する方法

そして最後になりましたが、競合を検出して処理する方法

これが良い出発点として役立つことを願っています。

于 2012-05-31T22:07:16.620 に答える
14

@Grantismoは、全体について優れた説明を提供します。誰が実際にこのことをしているのか知りたい場合は、2014年のGoogle IOアプリでGoogleがどのように行ったかを確認することをお勧めします(彼らがリリースするこれらのアプリのソースコードを常に詳しく調べる価値があります。そこから学ぶことがたくさんあります)。

これに関するブログ投稿は次のとおりです:http://android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html

基本的に、アプリケーション側では、シグナリング用のGCM、データフェッチ用の同期アダプター、およびコンテンツプロバイダーとの適切な通信により、永続的になります(つまり、DBをアプリの他の部分からの直接アクセスから分離します)。

また、2015年のコードを確認したい場合は、https ://github.com/google/ioschedをご覧ください。

于 2015-05-15T02:51:40.493 に答える
11

たとえば、テーブルtodoTableをからMySqlに同期したいSqlite

まず、との両方に1つの列名version (type INT)を作成しますtodoTableSqliteMySql ここに画像の説明を入力してください

次に、database_version1つの列名でテーブル名を作成しますcurrentVersion(INT)
ここに画像の説明を入力してください

MySql、新しいアイテムを追加しtodoTableたり、アイテムを更新したりする場合は、このアイテムのバージョンを+1アップグレードし、さらにアップグレードする必要があります。currentVersion ここに画像の説明を入力してください

Android、同期する場合(手動で同期ボタンを押すか、サービスを一定期間実行する):

SqlitecurrentVersion(現在は1)を使用してリクエストをサーバーに送信します。次に、サーバーで、バージョン値がcurrentVersion(1)より大きい
アイテムを見つけて、Androidに応答します(この例では、バージョン2のアイテム3がAndroidに応答します)MySqlSqlite

SQLite、新しいアイテムを追加または更新しtodoTable、currentVersionをアップグレードします

于 2016-07-20T10:46:07.887 に答える
6

parseplatform.orgを見てください。それはオープンソースプロジェクトです。

(また、 back4app.comで入手可能な商用パッケージに行くことができます。)

これは非常に単純でユーザーフレンドリーなサーバーサイドデータベースサービスであり、優れたAndroidクライアントサイドAPIを提供します。

于 2012-07-06T17:37:12.587 に答える
3

これを実現する1つの方法は、データを待機するサーバー側アプリケーションを用意することです。HttpRequestデータは、Javaのオブジェクトを使用して送信することも、独自のTCP/IPデータ転送ユーティリティを作成することもできます。データは、JSONフォーマットまたは適切と思われるその他のフォーマットを使用して送信できます。また、機密情報が含まれている場合は、サーバーに送信する前にデータを暗号化できます。サーバーアプリケーションが行う必要があるのはHttpRequests、データが入ってくるのを待って解析し、必要な場所に保存することだけです。

于 2012-05-31T08:49:56.297 に答える
1

Hessianに似たバイナリWebサービスプロトコルを使用することをお勧めします。それは非常にうまく機能し、Androidの実装があります。少し重いかもしれませんが、構築しているアプリケーションによって異なります。お役に立てれば。

于 2012-07-07T00:40:43.277 に答える
1

@Grantismoは、Android同期コンポーネントの概要を示しています。

SyncManagerAndroidライブラリは、Android Syncフレームワーク(AbstractThreadedSyncAdapter.OnPerformSync)にプラグインするための単純な双方向同期実装を提供します。

https://github.com/sschendel/SyncManagerAndroid

于 2014-10-26T15:25:41.127 に答える