2015-11-12 5 views
10

Normalerweise verwende ich Realm wie:Realm mit vorbelegten Daten in Assets?

RealmConfiguration config = new RealmConfiguration.Builder(applicationContext).deleteRealmIfMigrationNeeded().build(); 

Wie kann ich auf das Vermögen Ordner meines Projekts mit Daten einer Datenbank hinzufügen und es gelesen?

Antwort

8

Seit Realm Java 0.91.0 gibt es eine assetFile(String) Option auf der RealmConfiguration, die automatisch eine Datei aus Assets kopiert und diese bei Bedarf verwendet (zB wenn das Realm das erste Mal geöffnet wird oder aus irgendeinem Grund gelöscht wurde) :

RealmConfiguration config = new RealmConfiguration.Builder() 
    .assetFile("path/to/file/in/assets") // e.g "default.realm" or "lib/data.realm" 
    .deleteRealmIfMigrationNeeded() 
    .build() 

über die die Datei von Vermögenswerten das erste Mal ist das Reich geöffnet kopiert oder wenn es zu Migrationen aufgrund gelöscht wurde (denken sie daran, den Vermögenswert Realm in diesem Fall zu aktualisieren).


ALTE ANTWORT:

Es ist möglich, eine Realm-Datenbank im Ordner Assets zu bündeln, aber dann müssen Sie nur es von dort kopieren, wenn der App zum ersten Mal starten.

Wir haben ein Beispiel dafür, wie die Dateien hier kopieren: https://github.com/realm/realm-java/blob/master/examples/migrationExample/src/main/java/io/realm/examples/realmmigrationexample/MigrationExampleActivity.java#L101-Lundefined

copyBundledRealmFile(this.getResources().openRawResource(R.raw.default_realm), "default.realm"); 

private String copyBundledRealmFile(InputStream inputStream, String outFileName) { 
    try { 
     File file = new File(this.getFilesDir(), outFileName); 
     FileOutputStream outputStream = new FileOutputStream(file); 
     byte[] buf = new byte[1024]; 
     int bytesRead; 
     while ((bytesRead = inputStream.read(buf)) > 0) { 
      outputStream.write(buf, 0, bytesRead); 
     } 
     outputStream.close(); 
     return file.getAbsolutePath(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 
+1

vielleicht [diese] (https://github.com/realm/realm-java/blob/master/ Beispiele/migrationExample/src/main/java/io/realm/examples/realmigrationexample/MigrationExampleActivity.java # L56-L58) sollte aktualisiert werden, um 'assetFile()' zu verwenden – EpicPandaForce

+0

Gute Idee. Erledigt. –

+0

Schön zu sehen 'AssetFile()' hinzugefügt! Es wäre auch eine "Nur Kopie, wenn neuer" Option für das Szenario, in dem Realm schreibgeschützt verwendet wird (z. B. Produktkatalogszenario). Dies vermeidet eine unnötige Kopie, vereinfacht jedoch die Dinge.* (Ich würde gerne in Rente gehen: https://github.com/eggheadgames/android-realm-asset-helper!) * – mm2001

2

Wir haben ein ähnliches Bedürfnis hatten, und wollten auch Unterstützung für eine Nur-Lese-mit einer iOS-Version der App geteilt Reich Datenbank.

Wir haben eine einfache Bibliothek erstellt und Open-Source-Software. Es enthält den Kopiercode, der in der Antwort von @christian-melchior angegeben ist, sowie ein optionales Extra-Tracking für schreibgeschützte Realm-Datenbanken, die mit dem APK gebündelt sind. Kommentare und PRs wurden begrüßt. Siehe:

https://github.com/eggheadgames/android-realm-asset-helper

+0

Bitte geben Sie uns ein voll funktionsfähiges Projekt mit Code zu demonstrieren, wie man die Bibliothek verwendet –

3

Seit Realm 0.89.0RealmConfiguration.initialData(Realm.Transaction) nun verwendet werden, kann eine Realm-Datei zu füllen, bevor sie zum ersten Mal verwendet wird.

RealmConfiguration conf = new RealmConfiguration.Builder(context) 
.initialData(new Realm.Transaction() { 
       @Override 
       public void execute(Realm realm) { 
        realm.beginTransaction(); 
        realm.createObject(....) 
        realm.commitTransaction(); 
       } 
      }).deleteRealmIfMigrationNeeded().name("mRealm.db").build(); 
Realm realm = Realm.getInstance(conf); 
0

Sie können assetFile() Methode verwenden. Bitte beachten Sie, dass Sie assetFile() mit deleteIfMigrationNeeded() nicht verwenden können.

+0

dies ist nicht Ich habe versucht auf Realm 2.3.1 –

+0

Es sollte funktionieren, die API ist das gleiche für sie. – EpicPandaForce

+0

Ich habe das getan, aber hier ist das Problem, es ist nicht zerquetschen oder was, aber wenn ich AssetFile() -Methode verwenden, wird meine Abfrage leer sein. Es ist, als ob nichts passiert wäre, wo das Problem auftaucht. –

1

Realm hat einen speziellen Parameter in seiner RealmConfiguration.Builder namens AssetFile. Man könnte es gerne verwenden:

realmConfiguration = new RealmConfiguration.Builder() 
        .assetFile("dataBase/default.realm") // your app's packaged DB 
        ... 
        .build(); 

gerade yer Vermögenswerte DB Pfad und Dateinamen festgelegt und Sie sind gut ohne Android-realm-Asset-Helfer-lib zu gehen oder kopieren-Datei-from-Assets-Code. In diesem Beispiel liegt meine app-gepackte DB-Datei in "assets/dataBase/default.realm".
Hinweis, Version unter 2 hat ein bisschen einen anderen Weg assetFile zu nennen, sollten Sie Kontext passieren zusätzlich:

realmConfiguration = new RealmConfiguration.Builder(context) 
     .assetFile(context, "dataBase/default.realm") 
     .build();