Androidアプリとウェブサーバーの間でデータを同期する[終了]


262

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

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

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

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

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


1
最初に、サーバーとの通信プロトコルを把握(決定)する必要があります-したがって、どのデータをどのように転送できるかがわかります。
hovanessyan

これは私にとって重要です。SQLliteデータを転送します。しかし、私は他のデータを転送する方法を知っています。プロトコルについてのあなたの意味がわかりません。詳しく説明してください。
Omid Nazifi


1
konylabの製品であるkonylabを試してください。これは、さまざまなプラットフォーム(android、windows、ios)、webservers、データプロバイダー(salesforce、sapプロバイダー)、データベース(sqlserver、mysql ...)にエンドツーエンドのソリューションを提供します
saimadan

回答:


311

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


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

永続的ストレージ:

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

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

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

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

これは、ウェブサーバーとAndroidアプリ間でデータを送信するために使用する形式です。最近最も一般的な2つの形式は、XMLとJSONです。形式を選択するときは、利用可能なシリアル化ライブラリの種類を検討する必要があります。:私は、JSONシリアライズと呼ばれるgsonのための素晴らしいライブラリがあることを、ハンドオフ知っhttps://github.com/google/gsonを、私は同様のライブラリはXMLのために存在すると確信しているものの、。

同期サービス

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


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


3
大量のデータはどうですか?どうすれば同期できますか?
Pratik Butani 2014

4
非常によく説明しました。メモがあります... SyncAdapter->「たくさんの魔法を実行してください」。あなたがそれを黒魔術と呼んでいるといいのですが...それは完全に悪です。
MRodrigues、

@MRodrigues:SyncAdapterは開発者にとって黒魔術である可能性がありますが、それでも安定性と機能性のために魔法をかけます。他のライブラリよりもはるかに優れています
Milad Metias

2
Webサービス自体がAndroidデバイスと同期するには何が必要ですか?スプリングで可能ですか?
jublikon 2016年

58

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

確実に役立つ次のトピックを学習する必要があります。

  • SyncAdapter:アプリの同期アダプターコンポーネントは、デバイスとサーバーの間でデータを転送するタスクのコードをカプセル化します。アプリで指定したスケジュールとトリガーに基づいて、同期アダプターフレームワークは、同期アダプターコンポーネントのコードを実行します。

  • Realm:Realmはモバイルデータベースです。SQLiteとCore Dataに代わるものです。

  • レトロフィットタイプセーフなスクエアAndroidとJava用のHTTPクライアント、Inc.は学ばなければならない-スマートウェイに使用-改造を

そしてあなたのようなデータベースの同期ロジック:Android携帯のSQLiteデータベースをサーバーのMySQLデータベースと同期する方法は?

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


a-smart-way-to-use-retrofitへのリンクは
グレッグホルスト

@GregHolstが更新されました。
Pratik Butani

3
まだダウンしています。またはログインが必要ですか?Archive.orgはそれを持っている:web.archive.org/web/20160316222227/https://futurestud.io/blog/...
bobpaul

24

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

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

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

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

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

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

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

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

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


14

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

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

基本的に、アプリケーション側では、信号を送信するGCM、データを取得する同期アダプター、コンテンツプロバイダーと適切に通信して永続化します(そうです、アプリの他の部分からの直接アクセスからDBを分離します)。

また、2015年のコードを確認したい場合:https : //github.com/google/iosched


Google IOアプリのソースコードはIMOにかなり役立ちます。
Richeek、2016年

10

たとえば、テーブルtodoTableMySqlからSqlite

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

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

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

Android、同期したいとき(手動で同期ボタンを押すか、期間を指定して実行するサービス):

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

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


1
あなたのアイデアは素晴らしいですが、それでもテーブルのデザインを正しく理解できません。残りのサービスと適切な同期サービスとともに機能します
Ahesanali Suthar 2017

6

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

(同様に、back4app.comで入手可能な商用パッケージを入手できます。)

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


提供している無料プランは何ですか?
Prakhar Mohan Srivastava

12
http://parse.com/はシャットダウンされます。
Chintan Rathod 2016

4
parse.comの機能は引き続き使用できますが、独自のサーバーではオープンソース化されています
geniushkg

3

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


ローカルアプリとサーバーで更新されたデータを確認するにはどうすればよいですか?とどのように一緒にマージするのですか?すべてのレコードをJSONなどでアプリケーションに送信してマージするのはよくありません。どう思いますか?
Omid Nazifi

2
yesまたはnoのint / bool 1/0で「on server」などのフラグを使用できます。データのレコード/ファイル/ブロックが送信されたら、サーバーで成功したかどうかを確認し、ビットをyesに切り替えます。SQLiteのようなものを使用している場合は、 "SELECT * FROM my_table WHERE sent = 0"タイプの処理を実行して、新しいレコードを送信できます
Evan R.

1

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


1

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

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

https://github.com/sschendel/SyncManagerAndroid

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.