0

我有一个旧的数据库与一个结构: 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> 

但我认为在字符串数组中存储一个大数据并在第一次运行时得到它是不正确的。

+0

https://issuetracker.google.com/issues/62185732 – CommonsWare

+0

谢谢您的回答。我认为在某些情况下,这可以提供帮助。但是如果我没有旧数据库呢?用大量数据填充数据库是否有任何正确的解决方案? –

+0

“但是如果我没有旧数据库呢?” - 恩,创建它。运送预先填充的数据库要比运送空的数据库更有效,然后运行事务来填充它。 SQLite工具适用于每个平台,从命令行'sqlite3'二进制文件到桌面工具到浏览器插件。 – CommonsWare

回答

0

尝试制作数据的JOSN并将其存储在资产中,并且何时只需将它推入数据库中,JOSN便于阅读。

+0

与apk的任何人都可以提取json并获取数据...这是一个绝对的蹩脚的答案 – anshulkatta

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(); 

氪上的SQLite,SharedPreference和文件系统管理持久性太。我建议你阅读它的文档。

有关氪持久性库的详细信息: