我有一箇舊的數據庫與一個結構: 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