Обычно я использую Realm как:
RealmConfiguration config = new RealmConfiguration.Builder(applicationContext).deleteRealmIfMigrationNeeded().build();
Как я могу добавить в папку свойств моего проекта базу данных с данными и прочитать ее?
Обычно я использую Realm как:
RealmConfiguration config = new RealmConfiguration.Builder(applicationContext).deleteRealmIfMigrationNeeded().build();
Как я могу добавить в папку свойств моего проекта базу данных с данными и прочитать ее?
Так как 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;
}
Так как 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);
У нас была аналогичная необходимость, а также была нужна поддержка базы данных только для чтения, разделяемой с iOS-версией приложения.
Мы создали простую библиотеку и создали ее с открытым исходным кодом. Он включает в себя код копирования, указанный в ответе @christian-melchior, а также некоторое дополнительное отслеживание для базы данных (только для чтения), доступной только для APK. Комментарии и PR приветствуются. См:
У 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();
Вы можете использовать метод assetFile()
. Помните, что вы не можете использовать assetFile()
с deleteIfMigrationNeeded()
.