2017-07-09 6 views
2

私は現在、Retrofit経由で更新可能なデバイスにデータベースを保持するアプリケーションを開発していますが、キャッシュを許可するソリューションを設計しようとしていますパブリッシュ時に現在のデータベースに格納されます。JSiteをSQLiteファイルに保存する - Androidスタジオ

は現在、これは何が起こるかです:

  1. Sqliteをデータベースに手動で手によって作成された
  2. Sqliteをデータベースは
  3. アプリケーションが実行され、データベースがローカル・データベースに変換するアプリで、資産フォルダに入れていますthrough SQLiteOpenHelper/SQLiteAssetHelper

  4. 後で、デバイスはバックエンドと同期し、JSONファイルを取得し、新しく作成したデータベースを手動で更新します。

私は最初のステップをより自動化されたものに置き換えようとしています。

「同期」コードを呼び出してJSONを取得し、Sqliteデータベースに変換してアセットフォルダに保存する何らかの方法でGradleタスクを作成する方法はありますか?

手順3でローカルデータベースを構築するときに、代わりにJSONを直接使用する方法がありますか?

私はむしろ、プロジェクトを簡単に使用/更新するために他のプログラムから離れています。

ありがとうございました。

+0

テスト目的で最初のステップを置き換えますか?私はあなたが習得したいと思っているものを見落とすことはできません。 –

+0

私のアプリケーションにはデータベースが更新されています。新しい更新を公開すると、そのデータベースはできるだけ最新の状態にします。だから、私はjsonをつかんで、各アップデートの前に手動で変換していますが、私は最も最新のバージョンをフェッチして保存するソリューションが必要です。 –

+0

JSONを動的に定義しますか?それとも、データを変更するだけですか? (フィールドを追加することはまれである) – auval

答えて

2

JSONファイルを使用してデータベースを直接作成することができます。 JSONファイルを定義するには、データベースの各バージョンに対応する複数のノードがあります。各ノードには、そのバージョンのデータベースに対応するすべてのDDLコマンドが含まれています。

{ 
    "patches": [ 
    { 
     "version": 1, 
     "commands": [ 
     "CREATE TABLE User ...", 
     "CREATE TABLE Login ..." 
     ] 
    }, 
    { 
     "version": 2, 
     "commands": [ 
     "ALTER TABLE User ...", 
     "DROP TABLE Login ..." 
     ] 
    } 
    ] 
} 

この方法では、1つのJSONファイルを管理し、アプリケーション用に公開するすべての更新ファイルを更新するだけで済みます。誰かが最初にあなたのアプリをインストールすると、JSONファイルのすべてのDDLコマンドが実行されます。そうでない場合は、アップデート前にすでに存在しているバージョンよりも高いバージョンのデータベースに対応するコマンドだけが実行されます。

またSQLiteOpenHelperonCreateonUpgradeメソッドを更新する必要があります。 onCreateメソッドはjsonファイル全体を処理し、すべてのDDLコマンドを(バージョンに基づいて)順番に実行します。 onUpgradeは、より高いデータベースバージョンを持つノードの下でのみDDLコマンドを実行します。

@Override 
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { 
    List<Patch> patches = parseJson(); // Parse the JSON file and get the patches 
    for (Patch patch : patches) { 
     int databaseVersion = patch.getVersion(); 
     if (databaseVersion > oldVersion && databaseVersion <= newVersion) { 
      for (String command : patch.getCommands()) { 
       database.execSQL(command); 
      } 
     } 
    } 
} 
+0

このソリューションをさらに調べた後、最適な選択と判断しました。前述のように 'patches'ファイルを実装できるだけでなく、データセットそのものを更新するのにも同じアイデアを使用することができました。 jsonファイルを取得し、GSONで変換し、ネットワーク経由で更新している場合と同じロジックフローを実行します。 'BuildConfig.VERSION_CODE'を保存することで、このアイデアをいくつか最適化しました。アプリケーションは、データセットが新鮮であることを確認するために、更新ごとにJSONファイルを1回だけ読み込みます。 –

2

ページ単位でデータをキャッシュする必要がない場合(つまり、サーバーからすべてのデータを保存し、現在のデータを保存する必要があります)、JSONをStringとして保存してから、オフラインデータは、その後、接続可能な場合は新しいデータを取得します。

+0

フローを変更することをどうお勧めしますか?私は現在、データベースを作成するためにSQLiteOpenHelperを使用していますが、私はJSONからデータベースを作成できる何かに変更することができます。私はまた、 "last_viewed"などの他の列を追加するために、新しいデータベースの作成方法をいくらかコントロールする必要があります。 –

+0

JSONをローカルデータベースに保存したい場合は、GSONパーサーを使用してオブジェクトにJSOnを解析してください。その後、urオブジェクトとSQLiteの列を一致させ、 "last_viewed"のように追加したい列を前進させます。 – GiaLe

+0

私は現在、ネットワーク上でデータベースを更新する際に、GSONを使用して応答を解析しています。あなたのソリューションでは、コード内に事実の後に列を手動で追加する必要があると思います。それが最良の解決策であるかどうかはわかりません。私はたくさんの点検をしなければならず、ちょっと混乱するかもしれません。 –

2

あなたのJSONのツリー構造が頻繁に変更されない場合は、そのようjsonschema2pojoなどのツールでそれのためのPOJOを作ることができます。 Gsonを使用してインスタンスを変換します。

Googleの新しいライブラリ:Room Persistence Libraryを使用してこのPoJoを保存できます。

これは、あなたのためにPoJoを保存することができます(@Entityと注釈を付ける必要があります)。これはsqliteデータベースに保存され、データベースの変更についてあなたを更新することができます。 詳しくはGoogle I/O presentationsをご覧ください。

関連する問題