2012-02-29 18 views
6

ローカルデータ保存用にsqliteを使用するアンドロイドアプリとiPhoneアプリ(同じ機能)があります。最初にアプリケーションにはデータがないので、最初の実行時にリモートサーバーからデータを受け取り、sqliteデータベースに格納します。 sqliteデータベースはサーバーによって作成され、アプリケーションはそれを1つのファイルとしてダウンロードし、それを使ってアプリを購入します。データベースファイルは、今日の標準ではそれほど大きくはありませんが、5〜6 MBほどの小ささではありません。sqliteデータベースの同期/更新

今、しばらくの間、アプリケーションはサーバーからデータを更新する必要があります。いくつかのアプローチが考えられます:

  1. サーバーから新しい完全なデータベースをダウンロードし、既存のデータベースを置き換えます。これは、問題を処理する最も簡単な方法のように聞こえます。これは、5〜6 MBの繰り返しのダウンロードではないということです。アプリはアップデートをダウンロードするかどうかをユーザーに知らせるので、あまり問題になることはありません。

  2. 新しい/変更されたレコードのみを含むデルタデータベースをダウンロードし、削除するレコードに関する情報を何らかの形で保存します。これによりダウンロードサイズははるかに小さくなりますが、クライアント側の作業はより複雑になります。私は1つのデータベースを読んで、読まれたものに基づいて別のものを更新する必要があります。私の知る限りでは、insert into db1.table1 (select * from db2.table1)のようなものをsqliteで行う方法はありません。ここで、db1db2は同じ構造のtable1を含む2つのsqliteデータベースです。 (完全なsqliteデータベースには約10個のテーブルがあり、おそらく約500個のレコードが含まれています)

  3. データのデルタを他の形式(json、xmlなど)でダウンロードし、この情報を使用して更新しますアプリケーションのデータベース。前と同じ:サーバー側の問題ではなく、完全なデータベースよりもダウンロードのサイズが小さくてすみますが、更新を行うには非常に面倒なプロセスです。

3つのアプローチのどれをお勧めしますか?それとも私が見逃した別の方法がありますか?

事前に感謝します。

+0

https://stackoverflow.com/questions/4008015/android-sqlite-bidirectional-synchronization-sqlite –

答えて

1

多くの考慮事項と試行錯誤の末、私はオプション(2)と(3)の組み合わせに行きました。

  1. データがまったく存在しない場合、アプリケーションはサーバーから完全なデータベースファイルをダウンロードします。

  2. データが存在し、アップデートが必要な場合は、データベースをサーバからダウンロードしてデータベースをダウンロードします。また、特定のテーブルの特定の値の内容をチェックします。この値は、新しいデータベースは、元のを置き換えるためにあるか、削除/更新が含まれているかどうか/これは、最速の方法(性能面)であることが判明し、すべての重労働を残し(決定

を挿入するかどうかを述べるだろうすべてのものを1つのデータベースに格納するか、または更新のみを格納するか)を指定します。さらに、このアプローチでは、アルゴリズムを修正して、常に完全なデータベースをダウンロードする必要がある場合は、アプリケーションを再コンパイルして再配布する必要がなく、サーバー上の変更のみになります。

+0

サンプルやチュートリアルを投稿できますか? –

+0

私はsqliteデータベースを同期しようとしています - Googleドライブに格納されている1つの中央データベースと、個々のAndroidデバイスに保存されているオフラインデータベース(インターネットにアクセスできない場合があります) – Rohaq

+0

@Rohaqデバイスがインターネットにアクセスできない場合は、何かを同期することはできません。私の場合、同期は常にサーバーからデバイスへの一方向であり、データベースの構造は変更されず、データのみが変更されます。 –

-1

appがjsonファイルをより高速にダウンロードし、ローカルデータベースがより簡単に更新され、より多くのインターネット使用のオーバーヘッドを避けるため、アプローチ3をお勧めします。

だけで、サーバDBに応じて、その後、定期的にあなたがテーブルごとにJSONフィールドを持つことができる方法はありJSON

+2

「もっと速くjsonファイルをダウンロードしてください」という言葉についてはわかりません。私はいくつかのテスト/試作を行いました。完全なDBは約5 MB、すべてのデータを含むJSONファイルは約8 MBです。サイズの1.5倍を除けば、このような巨大なjsonの解析には非常に時間がかかることがあります。 –

+0

jsonには、個々のテーブルのすべてのレコードがフィールド名と値の形式で格納されます。また、別々にフェッチされる各テーブルに複数のjsonが存在します。 – Maneesh

+1

この場合、サーバーから完全なデータベースをダウンロードするよりも効率的になるとは思えません。 –

0

をフェッチすることで、同じことを更新、最初は空のDBを作成しますか?たとえば、usersという名前のテーブルがある場合、各ユーザーのJSONを格納する "json"という名前の列を持ちます。本質的には、残りのフィールドには情報が含まれています。

したがって、JSONで差分をダウンロードするときは、JSONをテーブルに挿入するだけです。

もちろん、このメソッドを使用すると、JSONを解析してモデル/オブジェクトを作成する際に追加作業が必要になりますが、これは追加の3-4ステップです。

+0

これは聞こえるほど単純ではありません。データベースのテーブルは外部キーとリンクされているため、あるテーブルのデータは他のテーブルのデータなしではほとんど意味を持ちません。データは本当にすべて一緒である必要があります。データを照会するときに、必要な情報を取得するために結合を使用します。 –

関連する問題