0

初めて Android プロジェクトに GreenDAO を使用していますが、初めてのユーザーのためにデータベースをシードする方法を知りたいですか? たとえば、テーブルがあり、ユーザーに代わって 5 行を挿入したいとします。

また、将来の更新で新しいテーブルを追加し、それらにもデータをシードする可能性がありますが、ユーザーが新しいバージョンのスキームをインストールしている場合でも、最初のテーブルに 5 行を挿入したいと考えています。

私の最初のアイデアは、自分のApp.onCreate()方法でそれを行い、シードが既に作成されているかどうかとしてフラグを設定するSharedPreferencesことでしたが、これに対するより実用的なアプローチが見つからないことに悩まされています。

どんな助けでも感謝します、ありがとう!

4

1 に答える 1

1

私は同じ問題を抱えていて、Web と GreenDAO のドキュメントを検索しましたが、信頼できるものは見つかりませんでした。

そこで、アプリの初回実行時に実行するコードを作成しました。そのためには、アプリを初めて起動するかどうかを確認する必要がありました。そのために、この回答をお勧めします。ここでその回答のコードを見ることができます:

public static void checkFirstRun(Context context) {

    final String PREFS_NAME = "TickTockPrefs";
    final String PREF_VERSION_CODE_KEY = "version_code";
    final int DOESNT_EXIST = -1;

    // Get current version code
    int currentVersionCode = 0;

    try {
        currentVersionCode = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode;
    } catch (android.content.pm.PackageManager.NameNotFoundException e) {
        // handle exception
        e.printStackTrace();
        return;
    }

    // Get saved version code
    SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
    int savedVersionCode = prefs.getInt(PREF_VERSION_CODE_KEY, DOESNT_EXIST);

    // Check for first run or upgrade
    if (currentVersionCode == savedVersionCode) {

        // This is just a normal run
        return;

    } else if (savedVersionCode == DOESNT_EXIST) {

        // TODO This is a new install (or the user cleared the shared preferences)
        seed(context);

    } else if (currentVersionCode > savedVersionCode) {

        // TODO This is an upgrade

    }

    // Update the shared preferences with the current version code
    prefs.edit().putInt(PREF_VERSION_CODE_KEY, currentVersionCode).apply();

}

そして、seed メソッド内で、挿入したいものを何でも記述できます。たとえば、データを事前入力したい "Person" エンティティがあるとします。

public static void seed(Context context) {

    DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "your-db", null);
    SQLiteDatabase db = helper.getWritableDatabase();
    DaoMaster daoMaster = new DaoMaster(db);
    DaoSession daoSession = daoMaster.newSession();

    Person person = new Person();
    person.setName("Jason");
    person.setFamily("Bourne");

    PersonDao personDao = daoSession.getPersonDao();
    personDao.insert(person);
}

エンティティのリストを挿入する場合は、insert() の代わりに insertInTx() メソッドを使用することに注意してください。ここで違いを見ることができます。

これが ORM シード メソッドとは異なることはわかっていますが、greenDAO コードを自分で操作する以外に他の方法はないようです。

于 2016-11-13T11:51:35.253 に答える