Modo correcto de hacer la migración de Realm

Utilizamos Realm para nuestra aplicación. Nuestra aplicación ha sido lanzada beta. Ahora quiero añadir un campo a uno de nuestros objetos de reino. Así que conseguí escribir RealmMigration y escribí uno también. La pregunta aquí es cómo aplicar esta migración de Realm a mi aplicación. Yo uso Realm.getInstance () obtener la instancia realm cuando quiera algo. Recuerde, Realm.getInstance () se está utilizando en toda la aplicación cada vez, quiero acceder a la base de datos Realm.

Por lo tanto, estoy bit consultado sobre cómo aplicar esta migración? Cualquier ventaja puede ser útil. Gracias.

Mi RealmMigration es como sigue.

public class RealmMigrationClass implements RealmMigration { @Override public void migrate(DynamicRealm realm, long oldVersion, long newVersion) { if(oldVersion == 0) { RealmSchema sessionSchema = realm.getSchema(); if(oldVersion == 0) { RealmObjectSchema sessionObjSchema = sessionSchema.get("Session"); sessionObjSchema.addField("isSessionRecordingUploading", boolean.class, FieldAttribute.REQUIRED) .transform(new RealmObjectSchema.Function() { @Override public void apply(DynamicRealmObject obj) { obj.set("isSessionRecordingUploading", false); } }); sessionObjSchema.setNullable("isSessionRecordingUploading",false); oldVersion++; } } } } public class Session extends RealmObject { @PrimaryKey private String id; @Required private Date date; private double latitude; private double longitude; private String location; private String note; private String appVersion; private String appType; private String deviceModel; private HeartRecording heart; private TemperatureRecording temperature; private LungsRecording lungs; @NotNull private boolean isSessionRecordingUploading; private boolean sessionInfoUploaded; private boolean lungsRecordingUploaded; private boolean heartRecordingUploaded; } 

Eliminado Getter y Setters de RealmObject para cortar la pregunta. La excepción se produjo cuando intento volver a instalar la aplicación sin desinstalar la anterior. Por favor aconséjame.

2 Solutions collect form web for “Modo correcto de hacer la migración de Realm”

Se describe aquí: https://realm.io/docs/java/latest/#migrations

Pero en esencia, sólo golpea la versión del esquema y establece la configuración de esta manera:

 RealmConfiguration config = new RealmConfiguration.Builder(context) .schemaVersion(2) // Must be bumped when the schema changes .migration(new MyMigration()) // Migration to run .build(); Realm.setDefaultConfiguration(config); // This will automatically trigger the migration if needed Realm realm = Realm.getDefaultInstance(); 

Esta es una clase de ayuda que he hecho para importar una base de datos .realm a mi aplicación. En mi caso sólo necesito leer el db creado desde una aplicación iOS en una aplicación de Android

 public class RealmImporter { private Activity activity; private String dbaFullName = "db.realm"; private int rawRealmResource = R.raw.dbRealmResource; public RealmImporter (Activity activity) { this.activity = activity; importData(); } private RealmConfiguration getConfiguration() { RealmConfiguration config = new RealmConfiguration.Builder() .name(dbaFullName) .modules(new MyRealmModule()) .migration(new RealmMigration() { @Override public void migrate(DynamicRealm realm, long oldVersion, long newVersion) { } }) .build(); return config; } public Realm getInstance() { Realm realm = Realm.getInstance(getConfiguration()); return realm; } private void importData() { copyBundledRealmFile(activity.getResources().openRawResource(rawRealmResource), dbaFullName); Realm.init(activity); } private String copyBundledRealmFile(InputStream inputStream, String outFileName) { try { File file = new File(activity.getFilesDir(), outFileName); if (file.exists()) { return file.getAbsolutePath(); } 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 (Exception e) { e.printStackTrace(); } return null; } // Create the module @RealmModule(classes = { Artigo.class, Comparativo.class, Indice.class, ItemDeArtigo.class}) public static class MyRealmModule{ } } 

Si tiene más de una configuración de reino (si necesita importar más de un archivo .realm) debe crear una clase RealmModule y usar la opción .modules () en RealmConfiguration.Builder.

Esto es necesario porque por defecto intenta comprobar si tu .realm tiene tablas para todos tus modelos que extienden RealmObject, y si tienes .realm, cada uno de ellos tendrá algunas de tus clases (pero no todas).

Otra información útil es que para las migraciones rápidas a Android. Todas las propiedades de String deben ser declaradas con @Antenciosidad requerida (si tienen un valor predeterminado).

Si el reino te está dando una extraña Excepción como "esta clase no se encontró en este esquema", intenta volver a ejecutar la aplicación, por lo general da un error diferente que puede sugerir al problema real, aunque a veces sólo da un error al azar.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.