如何在Android中填充Room Persistence数据库?

时间:2017-07-11 10:04:18

标签: android sqlite android-sqlite android-room android-architecture-components

我有一个旧数据库,下一个结构: Database structure

问题是在Room Persistence Database中创建和填充表的最佳方法是什么。我现在这样做的方法是在strings.xml中存储表数据,并使用firstrun将其推送到数据库中。

 public void createDb(final Context context) {
    mIsDatabaseCreated.setValue(false);

    prefs = context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE);

    boolean isFirstRun = prefs.getBoolean(prefKey, true);
    Observable.just(Room.databaseBuilder(context.getApplicationContext(),
            AppDatabase.class, AppDatabase.DATABASE_NAME).build())
            .map(appDatabase1 -> DatabaseInitUtil.initializeDb(
                    appDatabase1, 
                    context.getResources().getStringArray(R.array.themes),
                    isFirstRun))
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(appDatabase -> {
                mDb = appDatabase;
                mIsDatabaseCreated.setValue(true);
            });

    prefs.edit().putBoolean(prefKey, false).apply();
}

 static AppDatabase initializeDb(AppDatabase appDatabase, String[] themes, boolean isFirstRun) {

    if (isFirstRun) {
        List<ThemeEntity> themesEntities = new ArrayList<>(themes.length);
        generateData(themesEntities, themes);
        return insertData(appDatabase, themesEntities);
    } else {
        return appDatabase;
    }

}

private static void generateData(List<ThemeEntity> themesEntities, String[] themes) {
    for (String theme : themes) {
        ThemeEntity themeEntity = new ThemeEntity();
        themeEntity.setTheme(theme);
        themesEntities.add(themeEntity);
    }
}


<string-array name="themes">
    <item>@string/courage</item>
    <item>@string/death</item>
    <item>@string/forgiveness</item>
    <item>@string/faith</item>
    <item>@string/family</item>
    <item>@string/encouragement</item>
    <item>@string/friendship</item>
    <item>@string/joy</item>
    <item>@string/life</item>
    <item>@string/love</item>
    <item>@string/relationship</item>
    <item>@string/strength</item>
</string-array>

但我认为将大数据存储在字符串数组中并在首次运行时获取它是不正确的。

2 个答案:

答案 0 :(得分:1)

尝试制作数据的JOSN并将其存储在资产中,何时只需将其推入数据库并且JOSN更容易阅读。

答案 1 :(得分:0)

我知道答案与Room库有关,但真正的问题是你想在创建SQLite数据库时填充它。

我能做的是展示如何使用另一个名为Kripton Persistence Library的开源库来完成这项任务。

首先,正如其他答案所建议的那样,在项目的原始文件夹中使用JSON文件存储会更好。然后与Kripton一起完成任务非常简单。在你的应用程序类的onCreate方法中,假设你的数据库被称为QuickStartDataSource,只需编写类似于此的代码(它是一个不完整的代码,但我认为这是可以理解的):

BindQuickStartDataSource ds = BindQuickStartDataSource.build(DataSourceOptions.builder().databaseLifecycleHandler(new DatabaseLifecycleHandler() {

  @Override
  public void onCreate(SQLiteDatabase database) {
   // read json data from a file
   KriptonJsonContext jsonBinder = KriptonBinder.jsonBind();
   YouObject bean=jsonBinder.parse(.., YouObject.class);

   // insert data
   database.execSQL(..);  
  }

}).build();

Kripton也管理SQLite,SharedPreference和文件系统的持久性。我建议你阅读它的文档。

有关Kripton Persistence Library的更多信息: