migrations - Forma correcta de hacer Realm Migration Android
realm update android (2)
Usamos Realm para nuestra aplicación. Nuestra aplicación ha sido beta lanzada. Ahora quiero agregar un campo a uno de nuestros objetos de reino. Así que tuve que escribir RealmMigration y escribí uno también. La pregunta aquí es cómo aplicar esta migración de Reino a mi aplicación. Utilizo Realm.getInstance () para obtener la instancia de reino cada vez que quiero algo. Recuerde, Realm.getInstance () se usa en toda la aplicación cada vez, quiero acceder a la base de datos de Realm.
Por lo tanto, estoy un poco consultado sobre cómo aplicar esta migración? Cualquier pista puede ser útil. Gracias.
Mi RealmMigration es la siguiente.
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;
}
Se eliminaron Getter y Setters de RealmObject para cortar la pregunta. La excepción se produjo cuando intento reinstalar la aplicación sin desinstalar la anterior. Por favor aconséjame.
Esta es una clase de ayuda que he hecho para importar una base de datos .realm a mi aplicación. En mi caso, solo necesito leer el db creado desde una aplicación de 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 dominio (si necesita importar más de un archivo .realm), necesita crear una clase RealmModule y usar la opción .modules () en RealmConfiguration.Builder.
Esto es necesario porque, por defecto, el reino intenta verificar si su .realm tiene tablas para todos los modelos que amplían RealmObject, y si tiene varios .realm, cada uno de ellos tendrá algunas de sus clases (pero no todas).
Otra información útil es la de las migraciones rápidas a Android. Todas las propiedades de cadena deben declararse con anotación @Required (si tienen un valor predeterminado).
Si el reino le está dando una Excepción extraña como "esta clase no se encontró en este esquema", intente volver a ejecutar su aplicación, por lo general da un error diferente que puede sugerir el problema real, aunque a veces solo da un error aleatorio.
Se describe aquí: https://realm.io/docs/java/latest/#migrations
Pero en esencia, solo tienes que cambiar la versión del esquema y configurar 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();