“Migración de reino necesaria”, excepción en android al recuperar valores del dominio db

Estoy usando Realm como un back-end en mi aplicación. Creé una tabla llamada Configuración. Agregué valores en esa tabla, siguiendo los pasos dados en el sitio oficial de Realm. Pero cuando voy a recuperar valores de esa tabla, obtengo una excepción

“io.realm.exceptions.RealmMigrationNeededException: RealmMigration debe proporcionarse” en la línea: “realm = Realm.getInstance (getApplicationContext ());”.

En realidad, soy nuevo en Android y Reino, por lo que encontrar problemas para comprender lo que es un problema.

EDITAR: para las nuevas versiones de Realm, se agrega Realm.init (Context context)

Realm.init(context); RealmConfiguration config = new RealmConfiguration .Builder() .deleteRealmIfMigrationNeeded() .build(); 

NOTA: Con esta opción de configuración, cualquier cambio de esquema dará como resultado la pérdida de datos , específicamente:

  • un campo es agregado / eliminado
  • se agrega una nueva clase RealmObject
  • un RealmObject existente se elimina
  • @Required se agrega / elimina
  • @PrimaryKey se agrega / elimina
  • @Index se agrega / elimina

Por lo tanto, se recomienda principalmente mientras la aplicación se encuentra en la etapa de desarrollo.


O agregue una migración siguiendo los documentos oficiales:

https://realm.io/docs/java/latest/#migrations

Por ejemplo,

 public class Migration implements RealmMigration { @Override public void migrate(final DynamicRealm realm, long oldVersion, long newVersion) { RealmSchema schema = realm.getSchema(); if (oldVersion == 0) { RealmObjectSchema personSchema = schema.get("Person"); personSchema .addField("fullName", String.class, FieldAttribute.REQUIRED); oldVersion++; ... // hash code, equals 

Y

 Realm.init(context); RealmConfiguration config = new RealmConfiguration.Builder() .migration(new Migration()) // .deleteRealmIfMigrationNeeded() .build(); 

si carga la aplicación en la tienda, “eliminar y volver a instalar la aplicación” no funcionará para el otro usuario, por lo que debe trabajar con “eliminar” el dominio y “reinstalar” el dominio, no la aplicación. esta es la manera de hacerlo, ¡espero que ayude!

  RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).build(); try { return Realm.getInstance(realmConfiguration); } catch (RealmMigrationNeededException e){ try { Realm.deleteRealm(realmConfiguration); //Realm file has been deleted. return Realm.getInstance(realmConfiguration); } catch (Exception ex){ throw ex; //No Realm file to remove. } } 

EDITAR

Para el nuevo Reino (3.0.0), Realm ha cambiado la estructura del constructor, por lo que debe hacer algo como esto:

 Realm.init(context); RealmConfiguration config = new RealmConfiguration .Builder() .deleteRealmIfMigrationNeeded() .build(); 

Cambiaste algo a la estructura del reino.

Para solucionarlo, debe incluir la migración o simplemente eliminar la aplicación e instalarla de nuevo.

Funciona para mi

  Realm.init(context); Realm realm; try{ realm = Realm.getDefaultInstance(); }catch (Exception e){ // Get a Realm instance for this thread RealmConfiguration config = new RealmConfiguration.Builder() .deleteRealmIfMigrationNeeded() .build(); realm = Realm.getInstance(config); } 

Versión de Kotlin:

 val realm = try { Realm.init(this) val config = RealmConfiguration.Builder() .deleteRealmIfMigrationNeeded() .build() Realm.getInstance(config) } catch (ex: RealmMigrationNeededException) { Realm.getDefaultInstance() }