在Android上播种GreenDao数据库

时间:2016-11-02 06:25:48

标签: android android-sqlite greendao greendao3

我是第一次将GreenDAO用于Android项目,并且想知道如何为首次使用的用户播种数据库?比方说,我有一个表,并希望代表用户插入5行。

此外,我可能会在将来的更新中添加新表并将数据添加到这些表中,但仍希望将五行插入到第一个表中,即使用户正在安装该方案的较新版本。

我最初的想法是在我的App.onCreate()方法中执行此操作,然后在SharedPreferences中设置一个标记,因为种子是否已经制作,但它让我觉得我不能找到一种更实用的方法。

感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题并搜索了网络和GreenDAO的文档,但没有发现任何可靠的信息。

所以我写了一个代码,在第一次运行应用程序时运行。为此,我需要检查是否是我的应用程序第一次启动。为此,我建议this回答。您可以在此处查看该答案的代码:

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();

}

在种子方法中,您可以编写任何想要插入的内容。例如,假设我有一个“人”实体,我希望预先填充数据:

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

请注意,如果要插入实体列表,请使用insertInTx()方法而不是insert()。您可以看到差异here

我知道这与ORM种子方法不同,但除了你自己操纵greenDAO代码外似乎没有其他选择。