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和文件系統管理持久性太。我建議你閱讀它的文檔。

有關氪持久性庫的詳細信息: