2016-03-29 9 views
1

私はSQLIteOpenHelperを拡張し、テーブルの作成とアップグレードのようなものの世話をするアイテムをデータベースに事前ロードするより良い方法はありますか?私のAndroidアプリで

  1. SQLiteHelperクラスを持っています。

  2. SQLiteDatasource SQLiteHelperオブジェクトに対してCRUD操作を実行するクラス。

テーブルの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をコピーすることはできません(上のコードは実際のコードの単純化です)。

+1

私はおそらくCSVファイルに行きます。入力を可能な限り記憶域のように見せます。 –

+0

@CoreyOgburnこれは本当に興味深い考えです。しかし、私はオートコンプリートにCSVリーダーを見ることはできません。お勧めの方法はありますか? –

+1

私は自分のプロジェクトの一つでこれを行うかもしれないので、私も探し始めました。 [OpenCSV](http://opencsv.sourceforge.net/)は常に推奨されていますが、私はそれについての経験はまだありません。 –

答えて

1

それはthisにも答えます SQLiteAssetHelperライブラリはこの作業を非常に簡単にします。

それはGradleの依存関係として簡単に追加することもできます(ただしジャーでは、Ant/Eclipse用にも使用可能です)それはで見つけることができるドキュメントと一緒に、そして:
https://github.com/jgilfelt/android-sqlite-asset-helper

としては、マニュアルに記載されている:

  1. あなたのモジュールのGradleのビルドファイルに依存関係を追加します。

    dependencies { 
        compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:+' 
    } 
    
  2. データベースをassets/databasesというサブディレクトリのassetsディレクトリにコピーします。 (必要に応じて、あなたがAPKは既に全体として圧縮されているので、これは、必要とされていないなどassets/databases/my_database.zipとしてzipファイルにデータベースを圧縮することができる。。)
    assets/databases/my_database.db

  3. 作成します。例えばクラスは、例えば:

    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); 
        } 
    } 
    
+1

アプリを更新するとどうなりますか? –

+0

「何のこと?」の意味は?アセットフォルダも更新されます:) – bendaf

0

あなたはシリアル化オブジェクトで、あなたのデータを記憶させることができます。ここをクリックしてください:

How do I serialize an object and save it to a file in Android?

+0

これは本当に私の中心的な問題に対処しているのか分かりません.PariscelableはAndroidのSerializableよりもはるかに速いのですか? –

+0

けれども、Parceleable Objectsはかなりの量の定型文を持っているため、クラスを読みやすく維持するのが難しくなります – Rubber

関連する問題