2013-03-22 5 views
21

大規模なアプリケーション用のコアデータモデルのセットアップを開始しており、サーバーデータベースとオフライン機能については、適切な同期方法/テクニックに関するフィードバックを期待していました。iOS - コアデータとサーバーデータベースの同期のベストプラクティス

Webサーバー/データベースにPHPとmySQLを使用しています。

私はすでに、私はより多くの方法論やトラッキングデータの変更の特定のインスタンスとの助けのために探していますなどなど、コアデータの格納、データを受信し、接続する方法を知っている:

A)アプリを確認して、サーバーはオンラインとオフラインの使用中に同期しています(つまり、オフラインアクティビティはオンラインに戻って一度プッシュアップされます)。 B)データをアプリに保存する速度を最適化します。

私の主な質問は以下のとおりです。

まだ(オフラインで使用した後に)同期させる必要があるアプリでどのような新しい/更新されたデータをチェックするための最良の方法は何ですか?

(つまり、すべてのコアデータエンティティでBOOLタイプの 'isSynchronized'属性を設定し、正常に送信されて応答がサーバーから返されると 'YES'に更新します)。これが最善の方法ですか?

サーバからコアデータへのデータ保存速度を最適化する最適な方法は何ですか?

(つまり、各エンティティを反復処理せず、毎回更新するだけで、サーバーデータベース上のデータよりも古いコアデータのデータを更新するにはどうすればよいですか)すべてのテーブルに更新タイムスタンプを追跡するためのサーバーデータベース列を追加しなくても可能ですか?

また、データをダウンロードしてCore Dataに保存する方法はすでに分かっていますが、処理時間を最適化しながらアプリケーションとサーバーデータベース間の同期を確保するためのベストプラクティスについてのヘルプを探しています。

+0

はhttp://stackoverflow.com/questions/413086/を見ますクライアント/サーバ同期パターンアルゴリズム – danh

答えて

9

電話機のコアデータレコードとサーバのmysqlテーブルの両方のデータベースに、最後に変更されたタイムスタンプを格納します。

最後の同期以降に変更されたすべてのものが検索され、最後の同期のタイムスタンプとともにサーバーに送信されます。サーバーは、提供された同期タイムスタンプから変更されたすべてのもので応答します。

多くのレコードが変更された場合、パフォーマンスが問題になります。私はそれ自身の管理されたオブジェクトコンテキストを持っている背景NSOpeartionで同期を行います。バックグラウンドスレッドが管理オブジェクトコンテキストを変更し終えたら、すべての変更をメインスレッドの管理対象オブジェクトコンテキストにマージするためのAPIがあります。これは、コンフリクトが発生した場合にすべての変更を破棄するように設定できます同期が行われている間にユーザーがデータを変更します。その場合、ちょっと待ってからもう一度同期をやり直してみてください。

古いハードウェアでは、多くの最適化を行った後でも、ユーザーがアプリで作業を開始すると完全に同期を中止する必要がありました。単にシステムリソースをあまりにも多く使用していました。より現代的なiOSデバイスは、おそらくあなたがそれをやる必要がないほど高速です。(私は30,000ので行が電話で更新または挿入されたもので、「レコードの多くが変更されている」と述べた方法による)

+0

同上。また、最後に成功したサーバーコールの時刻を格納している各エンティティで、変更日を使用します。各API呼び出しで、これをサーバーに渡します。このサーバーには、何か変更されたときにいつでも各テーブルの同様の列を設定するトリガーがあります。そして、私は[この質問]のような3つのコンテキストモデルを使用して更新を処理します(http://stackoverflow.com/questions/10542097/implementing-fast-and-efficient-core-data-import-on-ios-5)非同期に。 – enjayem

+0

私はまた、最後に同期したデータとテーブルレコードのdatetimestampを使って同期を管理しています。 –

+1

電話機のタイムスタンプとサーバーのタイムスタンプがまったく同じ時刻を使用していることを確認する方法を教えてください。たとえば、電話機のタイムスタンプがサーバーよりも10秒早く、その間に変更があった場合、データは失われます。 –

関連する問題