Pregunta ¿Reino con datos pre poblados en los activos?


Normalmente uso Realm como:

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

¿Cómo puedo agregar a la carpeta de activos de mi proyecto una base de datos con datos y leerlos?


11
2017-11-12 15:23


origen


Respuestas:


Desde Realm Java 0.91.0 ha habido un assetFile(String) opción en el RealmConfiguration que automáticamente copiará un archivo de los activos y lo usará si es necesario (por ejemplo, si el Reino se abre la primera vez o se ha eliminado por algún motivo):

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

Lo anterior copiará el archivo de los activos la primera vez que se abra el Reino o si se ha eliminado debido a migraciones (recuerde actualizar el Reino del activo en ese caso).


ANTIGUA RESPUESTA:

Es posible agrupar una base de datos de Realm en la carpeta de activos, pero luego solo debe copiarla desde allí al iniciar la aplicación por primera vez.

Tenemos un ejemplo de cómo copiar los archivos aquí: 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;
}

8
2017-11-13 07:29



Desde el Reino 0.89.0  RealmConfiguration.initialData(Realm.Transaction) ahora se puede usar para llenar un archivo de Realm antes de usarlo por primera vez.

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
2018-05-19 14:39



Tuvimos una necesidad similar, y también queríamos soporte para una base de datos de solo lectura compartida con una versión de iOS de la aplicación.

Creamos una biblioteca simple y la hemos abierto. Incluye el código de copia proporcionado en la respuesta de @ christian-melchior, así como algunos rastreos adicionales opcionales para las bases de datos de solo lectura incluidas con el APK. Comentarios y relaciones públicas bienvenidos. Ver:

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


2
2018-04-11 19:09



Realm tiene un parámetro especial en su RealmConfiguration.Builder llamado assetFile. Podrías usarlo así:

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

simplemente configure sus activos Ruta de acceso DB y nombre de archivo y estará listo sin ningún código android-realm-asset-helper lib o copy-file-from-assets. En este ejemplo, mi aplicación de archivo DB empaquetado se encuentra en "assets / dataBase / default.realm".
Tenga en cuenta que la versión de abajo 2 tiene un poco más de manera de llamar a assetFile, debe pasar el contexto de forma adicional:

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

1
2017-11-09 17:32



Puedes usar assetFile() método. Tenga en cuenta que no puede usar assetFile() con deleteIfMigrationNeeded().


0
2017-08-24 08:11