私のAndroidアプリには
SQLIteOpenHelperを拡張し、テーブルの作成やアップグレードなどを処理するSQLiteHelperクラス。
SQLiteHelperオブジェクトに対してCRUD操作を実行するSQLiteDatasourceクラス。
ユーザーが最初にアプリを使用したときに何かが存在するように、特定のアイテムをテーブルの1つにプリロードしたいと思います。これらのアイテムは変更される可能性があるので、モジュール化したいと思います。
今私はそれをこのようにやっています:
public class MyDefaults {
public static final ArrayList<HashMap<String, String>> MY_DEFAULTS;
static {
MY_DEFAULTS = new ArrayList<HashMap<String, String>>();
HashMap<String, String> map = new HashMap<String, String>();
//All the values below you change to whatever defaults you want
map.clear();
map.put(SQLiteHelper.KEY_1, "Value 1A");
map.put(SQLiteHelper.KEY_2, "Value 2A");
map.put(SQLiteHelper.KEY_3, "Value 3A");
MY_DEFAULTS.add(new HashMap<String, String>(map));
map.clear();
map.put(SQLiteHelper.KEY_1, "Value 1B");
map.put(SQLiteHelper.KEY_2, "Value 2B");
map.put(SQLiteHelper.KEY_3, "Value 3B");
MY_DEFAULTS.add(new HashMap<String, String>(map));
map.clear();
map.put(SQLiteHelper.KEY_1, "Value 1C");
map.put(SQLiteHelper.KEY_2, "Value 2C");
map.put(SQLiteHelper.KEY_3, "Value 3C");
MY_DEFAULTS.add(new HashMap<String, String>(map));
//and so on
}
}
そして、SQLiteDatasourceクラスに、次のデフォルト値の挿入を実行するメソッドがあります。
public void preloadDefaults() {
mDatabase.beginTransaction();
try {
for (HashMap<String, String> map : MyDefaults.MY_DEFAULTS) {
ContentValues values = new ContentValues();
values.put(SQLiteHelper.KEY_1, map.get(SQLiteHelper.KEY_1));
values.put(SQLiteHelper.KEY_2, map.get(SQLiteHelper.KEY_2));
values.put(SQLiteHelper.KEY_3, map.get(SQLiteHelper.KEY_3));
mDatabase.insert(SQLiteHelper.SOME_TABLE, null, values);
}
}
finally {
mDatabase.endTransaction();
}
}
これを行う私の方法は悪い習慣と見なされますか?テーブルが作成された後にテーブルに挿入される「デフォルト」を定義するためのより良い方法はありますか?おそらく静的クラスの代わりにXMLを介して?
注:実行時に作成された他の値を使用してこれらのフィールドを実際に挿入しているため、外部DBをコピーすることはできません(上記のコードは、実際のコードを単純化したものです)。
それがであるので、この答えもSQLiteAssetHelperライブラリーは、このタスクは、本当に簡単になります。
Gradle依存関係として追加するのは簡単です(ただし、JarはAnt / Eclipseでも利用できます)。ドキュメントと一緒に、https:
//github.com/jgilfelt/android-sqlite-asset-helperにあります。
ドキュメントで説明されているように:
モジュールのgradleビルドファイルに依存関係を追加します。
dependencies {
compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:+'
}
データベースを、というサブディレクトリのアセットディレクトリにコピーしますassets/databases
。例えば:
assets/databases/my_database.db
(オプションで、データベースをなどのzipファイルに圧縮できますassets/databases/my_database.zip
。APKはすでに全体として圧縮されているため、これは必要ありません。)
次に例を示します。
public class MyDatabase extends SQLiteAssetHelper {
private static final String DATABASE_NAME = "my_database.db";
private static final int DATABASE_VERSION = 1;
public MyDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加