1

我有一个具有下一个结构的旧数据库: 数据库结构

问题是在 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>

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

4

2 回答 2

1

尝试制作一个 JOSN 数据并将其存储在资产中,当您需要时只需将其推送到数据库中,JOSN 就更容易阅读。

于 2017-07-11T11:01:50.990 回答
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 持久性库的更多信息:

于 2017-09-08T01:33:18.777 回答