我有一个旧的数据库与一个结构: Database structure如何在Android中填充Room Persistence数据库?
的问题是什么是创建和填充房间持久性数据库表的最佳途径。我现在做的方式是在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>
但我认为在字符串数组中存储一个大数据并在第一次运行时得到它是不正确的。
https://issuetracker.google.com/issues/62185732 – CommonsWare
谢谢您的回答。我认为在某些情况下,这可以提供帮助。但是如果我没有旧数据库呢?用大量数据填充数据库是否有任何正确的解决方案? –
“但是如果我没有旧数据库呢?” - 恩,创建它。运送预先填充的数据库要比运送空的数据库更有效,然后运行事务来填充它。 SQLite工具适用于每个平台,从命令行'sqlite3'二进制文件到桌面工具到浏览器插件。 – CommonsWare