Область с предварительно заполненными данными в активы?

Обычно я использую Realm как:

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

Как я могу добавить в папку свойств моего проекта базу данных с данными и прочитать ее?

Ответ 1

Так как Realm Java 0.91.0 в RealmConfiguration была опция assetFile(String), которая автоматически копирует файл из активов и, если необходимо, использует его (например, если Realm открывается в первый раз или был удален для по какой-то причине):

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

Вышеприведённое копирует файл из активов при первом открытии Realm или если он был удален из-за миграции (не забудьте обновить Realm в этом случае).


OLD ANSWER:

В папке с ресурсами можно связать базу данных Realm, но тогда вам просто нужно ее скопировать, когда вы запускаете приложение в первый раз.

У нас есть пример того, как копировать файлы здесь: 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;
}

Ответ 2

Так как Realm 0.89.0 RealmConfiguration.initialData(Realm.Transaction) теперь можно использовать для заполнения файла Realm до его использования в первый раз.

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

Ответ 3

У нас была аналогичная необходимость, а также была нужна поддержка базы данных только для чтения, разделяемой с iOS-версией приложения.

Мы создали простую библиотеку и создали ее с открытым исходным кодом. Он включает в себя код копирования, указанный в ответе @christian-melchior, а также некоторое дополнительное отслеживание для базы данных (только для чтения), доступной только для APK. Комментарии и PR приветствуются. См:

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

Ответ 4

У Realm есть специальный параметр в своем RealmConfiguration.Builder, называемом assetFile. Вы можете использовать его как:

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

просто установите путь и имя файла базы данных yer и вы можете обойтись без каких-либо программных пакетов android-real-asset-helper lib или copy-file-from-assets. В этом примере файл с DB файлом, связанным с приложением, находится в "assets/dataBase/default.realm".
Примечание. В версии ниже 2 есть еще один способ вызвать assetFile, вы должны передать контекст дополнительно:

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

Ответ 5

Вы можете использовать метод assetFile(). Помните, что вы не можете использовать assetFile() с deleteIfMigrationNeeded().