6

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

現在、アプリはサーバーからのデータを更新する必要があります。私が考えることができるいくつかのアプローチがあります:

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

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

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

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

よろしくお願いします。

4

3 に答える 3

1

多くの検討と試行錯誤の末、私はオプション(2)と(3)の組み合わせを選びました。

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

  2. データが存在し、更新が必要な場合、アプリはサーバーからデータベースをダウンロードます。そして、特定のテーブルの特定の値の内容をチェックします。その値は、新しいデータベースが元のデータベースを置き換えるのか、それとも削除/更新/挿入が含まれるのかを示します。

これは(パフォーマンスの面で)最速の方法であり、すべての面倒な作業(すべてを1つのデータベースに入れるか更新だけにするかを決定する)をサーバーに任せます。さらに、このアプローチでは、アルゴリズムを変更して、たとえば常に完全なデータベースをダウンロードする必要がある場合、アプリを再コンパイルして再配布する必要がなく、サーバー上での変更のみになります。

于 2012-03-07T14:15:32.573 に答える
0

各テーブルにJSONフィールドを設定する方法はありますか?たとえば、usersという名前のテーブルがある場合は、各ユーザーのJSONを格納する「json」という名前の列があります。本質的には、残りのフィールドが持つ情報が含まれます。

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

もちろん、このメソッドでは、JSONを解析し、そこからモデル/オブジェクトを作成するために追加の作業を行う必要がありますが、それは3〜4の小さなステップです。

于 2012-02-29T15:02:33.613 に答える
-1

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

最初はサーバーデータベースに従って空のデータベースを作成し、次にjsonをフェッチして定期的に更新します。

于 2012-02-29T13:22:08.707 に答える