Search code examples
androidrealmrealm-migration

Android : Realm Migration Issue


I am new to android and I used realm in my APP but I didn't specified the schemaversion then, now when I want to upgrade the app and implement migration.

Previously, I was doing this,

Realm.init(getApplicationContext());

RealmConfiguration realmConfiguration =
                        new RealmConfiguration.Builder().build();

realm = Realm.getInstance(realmConfiguration);

And now,

Realm.init(getApplicationContext());

RealmConfiguration realmConfiguration =
                            new RealmConfiguration.Builder().schemaVersion(1).migration(new Migration()).build();

realm = Realm.getInstance(realmConfiguration);  

And, I am getting this error.

java.lang.IllegalArgumentException: Configurations cannot be different if used to open the same file. 
Cached configuration: 
realmDirectory: /data/user/0/in.avanti_app.student_companion.debug/files
realmFileName : default.realm
canonicalPath: /data/data/in.avanti_app.student_companion.debug/files/default.realm
key: [length: 0]
schemaVersion: 1
migration: in.avanti_app.student_companion.realmClasses.Migration@25
deleteRealmIfMigrationNeeded: false
durability: FULL
schemaMediator: io.realm.DefaultRealmModuleMediator@793ec9a4

New configuration: 
realmDirectory: /data/user/0/in.avanti_app.student_companion.debug/files
realmFileName : default.realm
canonicalPath: /data/data/in.avanti_app.student_companion.debug/files/default.realm
key: [length: 0]
schemaVersion: 0
migration: null
deleteRealmIfMigrationNeeded: false
durability: FULL
schemaMediator: io.realm.DefaultRealmModuleMediator@793ec9a4

I also override the hasCode and equals in Migration class.


Solution

  • Calling Realm.init(Context) initializes a "default configuration" in the following code

    public static synchronized void init(Context context) {
        if (BaseRealm.applicationContext == null) {
            if (context == null) {
                throw new IllegalArgumentException("Non-null context required.");
            }
            RealmCore.loadLibrary(context);
            defaultConfiguration = new RealmConfiguration.Builder(context).build();
            ObjectServerFacade.getSyncFacadeIfPossible().init(context);
            BaseRealm.applicationContext = context.getApplicationContext();
            SharedRealm.initialize(new File(context.getFilesDir(), ".realm.temp"));
        }
    }
    

    But new RealmConfiguration.Builder(context).build(); sets a configuration without schema version, migration, deleteIfMigrationNeeded(), etc

    In order to set a new default configuration, you need to create your config and then call Realm.setDefaultConfiguration(realmConfig);


    RealmConfiguration realmConfiguration =
             new RealmConfiguration.Builder().schemaVersion(1).migration(new Migration()).build();
    Realm.setDefaultConfiguration(realmConfiguration);
    realm = Realm.getDefaultInstance();