Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中填充Room持久性数据库?_Android_Sqlite_Android Sqlite_Android Room_Android Architecture Components - Fatal编程技术网

如何在Android中填充Room持久性数据库?

如何在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

我有一个旧数据库,其结构如下:

问题是在Room持久性数据库中创建和填充表的最佳方法是什么。我现在的做法是将表数据存储在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>
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持久性库的详细信息:


谢谢您的回答。我认为在某些情况下这会有所帮助。但是如果我没有一个旧的数据库呢?用大量数据填充数据库是否有正确的解决方案?“但如果我没有旧数据库怎么办?”--嗯,创建它。发送预填充的数据库比“发送”空数据库然后运行事务来填充它要高效得多。SQLite工具适用于所有平台,从命令行
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();