0

Ich habe eine alte Datenbank mit der nächsten Struktur: Database structureWie kann ich die Raumpersistenz-Datenbank in Android belegen?

Die Frage ist, was der beste Weg ist, Datenbank zu erstellen und füllen Tabellen in Raum Persistenz. Die Art und Weise, wie ich es jetzt mache, ist das Speichern von Tabellendaten in strings.xml und das Einfügen in die Datenbank mit 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> 

Aber ich denke, dass Speichern von großen Daten in Strings-Arrays und bekommen es mit dem ersten Lauf ist es nicht richtig.

+0

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

+0

Vielen Dank für Ihre Antwort . Ich denke in manchen Fällen kann das helfen. Aber was, wenn ich keine alte Datenbank hätte? Gibt es eine richtige Lösung, um eine Datenbank mit einer großen Datenmenge zu füllen? –

+0

"Aber was wäre, wenn ich keine alte Datenbank hätte?" - Um, erstelle es. Es ist viel effizienter, eine vorbelegte Datenbank zu versenden, als eine leere Datenbank zu "versenden" und dann Transaktionen auszuführen, um sie zu füllen. SQLite-Tools sind für jede Plattform verfügbar, von der Befehlszeile "sqlite3" -Binärdateien über Desktop-Tools bis hin zu Browser-Plugins. – CommonsWare

Antwort

0

Versuchen Sie, einen JOSN von Daten zu machen und in Assets zu speichern, und wann immer Sie es brauchen, drücken Sie es einfach in die DB und JOSN ist viel einfacher zu lesen.

+0

jeder mit der apk kann die json extrahieren und die daten bekommen ... das ist eine absolut lahme antwort – anshulkatta

0

Ich weiß, dass die Antwort Zimmerbibliothek zugeordnet ist, aber das eigentliche Problem ist, dass Sie eine SQLite-Datenbank füllen möchten, wenn es erstellt wird.

Was ich tun kann, ist zeigen, wie diese Aufgabe mit einer anderen Open-Source-Bibliothek namens Kripton Persistence Library zu erreichen.

Zuerst, wie von anderer Antwort vorgeschlagen, ist es besser, einen JSON-Dateispeicher im Rohordner Ihres Projekts zu verwenden. Dann ist die Aufgabe mit Kripton ziemlich einfach. In Verfahren onCreate von Ihnen Anwendungsklasse, soll man Datenbank QuickStartDataSource genannt wird, nur Code schreiben, ähnlich wie diese (es ist ein unvollständiger Code, aber ich denke, es ist verständlich):

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

Kripton Persistenz verwalten auf SQLite, SharedPreference und Dateisystem auch. Ich empfehle Ihnen, die Dokumentation zu lesen.

Weitere Informationen über Kripton Persistence Library:

Verwandte Themen