如何在Android中填充Room持久性数据库?
我有一个旧数据库,其结构如下: 问题是在Room持久性数据库中创建和填充表的最佳方法是什么。我现在的做法是将表数据存储在strings.xml中,并使用firstrun将其推入数据库如何在Android中填充Room持久性数据库?,android,sqlite,android-sqlite,android-room,android-architecture-components,Android,Sqlite,Android Sqlite,Android Room,Android Architecture Components,我有一个旧数据库,其结构如下: 问题是在Room持久性数据库中创建和填充表的最佳方法是什么。我现在的做法是将表数据存储在strings.xml中,并使用firstrun将其推入数据库 public void createDb(final Context context) { mIsDatabaseCreated.setValue(false); prefs = context.getSharedPreferences(context.getPackageName(), Co
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>
public void createDb(最终上下文){
mIsDatabaseCreated.setValue(false);
prefs=context.getSharedReferences(context.getPackageName(),context.MODE\u PRIVATE);
boolean isFirstRun=prefs.getBoolean(prefKey,true);
Observable.just(Room.databaseBuilder(context.getApplicationContext()),
AppDatabase.class,AppDatabase.DATABASE_NAME).build())
.map(appDatabase1->DatabaseInitUtil.initializeDb(
应用数据库1,
context.getResources().getStringArray(R.array.themes),
isFirstRun(第一次运行))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(appDatabase->{
mDb=appDatabase;
mIsDatabaseCreated.setValue(true);
});
prefs.edit().putBoolean(prefKey,false.apply();
}
静态AppDatabase initializeDb(AppDatabase AppDatabase,字符串[]主题,布尔值isFirstRun){
如果(isFirstRun){
列表主题实体=新的数组列表(themes.length);
生成数据(主题实体、主题);
返回insertData(appDatabase,themesEntities);
}否则{
返回appDatabase;
}
}
私有静态void generateData(列出主题实体、字符串[]主题){
for(字符串主题:主题){
Themeenty Themeenty=新Themeenty();
themeEntity.setTheme(主题);
主题实体。添加(主题实体);
}
}
@弦/勇气
@弦/死亡
@线/宽恕
@弦/信念
@字符串/族
@串/鼓励
@串/友谊
@弦乐
@字符串/生命
@弦/爱
@字符串/关系
@弦/强度
但我认为将大量数据存储在字符串数组中并在第一次运行时获取它是不正确的。尝试制作一个数据JOSN并将其存储在资产中,当您需要将其推入数据库时,JOSN更易于读取。我知道答案与Room library相关,但真正的问题是,您希望在创建SQLite数据库时填充它 我能做的就是展示如何使用另一个名为Kripton持久性库的开源库来完成这项任务 首先,正如其他答案所建议的,最好在项目的原始文件夹中使用JSON文件存储。那么克里普顿的任务就相当简单了。在应用程序类的方法onCreate中,假设您的数据库名为QuickStartDataSource,只需编写类似的代码(这是一个不完整的代码,但我认为可以理解): Kripton还管理SQLite、SharedReference和文件系统上的持久性。我建议您阅读它的文档 有关Kripton持久性库的详细信息:
sqlite3
二进制文件到桌面工具再到浏览器插件。任何拥有apk的人都可以提取json并获取数据……这绝对是一个蹩脚的答案
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();