Realm-java: io.realm.exceptions.RealmMigrationNeededException: Field 'id' not found for type 'UsersRealm'

Created on 9 Jan 2015  Â·  7Comments  Â·  Source: realm/realm-java

My class UsersRealm:
import io.realm.RealmObject;
public class UsersRealm extends RealmObject {
private String id;
private String email;
...
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
...

But in logcat i catch an Exception:
01-09 16:54:28.797 8858-8858/com.eventagrate.idex E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.eventagrate.idex/com.eventagrate.idex.activities.MainActivity}: io.realm.exceptions.RealmMigrationNeededException: Field 'id' not found for type 'UsersRealm'
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
at android.app.ActivityThread.access$600(ActivityThread.java:127)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4507)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
at dalvik.system.NativeStart.main(Native Method)
Caused by: io.realm.exceptions.RealmMigrationNeededException: Field 'id' not found for type 'UsersRealm'
at io.realm.Realm.createAndValidate(Realm.java:585)
at io.realm.Realm.create(Realm.java:464)
at io.realm.Realm.getInstance(Realm.java:415)
at io.realm.Realm.getInstance(Realm.java:265)
at com.eventagrate.idex.fragments.HomeFragment.onCreateView(HomeFragment.java:115)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1786)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:548)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1136)
at android.app.Activity.performStart(Activity.java:4475)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1941)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
            at android.app.ActivityThread.access$600(ActivityThread.java:127)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4507)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
            at dalvik.system.NativeStart.main(Native Method)

On (HomeFragment.java:115) i have
realm = Realm.getInstance(getActivity());

If i really delete field "id" from class then i catch exception with my next field "email":
Caused by: io.realm.exceptions.RealmMigrationNeededException: Field 'email' not found for type 'UsersRealm'

Why it can happens? Rebuild project and restart AndroidStudio not helped.

T-Help

Most helpful comment

You need to add
.deleteRealmIfMigrationNeeded()
to your Application's onCreate. It'll look like this.
```
@Override
public void onCreate() {
super.onCreate();
Realm.init(context);
RealmConfiguration realmConfiguration = new RealmConfiguration
.Builder()
.deleteRealmIfMigrationNeeded()
.build();
Realm.setDefaultConfiguration(realmConfiguration);
}

All 7 comments

Maybe, you need to write migration from old realm db on your device, or just clear app data at your application on device.

Thanks, Sergey. Clear app data helps. How it could happens? How can i save realm object without field earlier?

Only if you have _ever_ run your program without that field present.

While you are develop the app, you can use Realm.deleteRealmFile() to delete the file on each startup. That way you don't have to deal with migrations while developing your datamodel.

You need to add
.deleteRealmIfMigrationNeeded()
to your Application's onCreate. It'll look like this.
```
@Override
public void onCreate() {
super.onCreate();
Realm.init(context);
RealmConfiguration realmConfiguration = new RealmConfiguration
.Builder()
.deleteRealmIfMigrationNeeded()
.build();
Realm.setDefaultConfiguration(realmConfiguration);
}

Or define a migration that adds the field to the schema.

Just need to add this method and call it in onCraete

public static Realm getRealm() {
        if (mRealm != null) {
            mRealm = null;
        }
        Realm.init(getAppInstance());
        RealmConfiguration config = new RealmConfiguration
                .Builder()
                .deleteRealmIfMigrationNeeded()
                .name(Constatnts.DataBase.DB_FILE_NAME).build();
        Realm.setDefaultConfiguration(config);

        return Realm.getInstance(config);
    }

Note: It would be delete all database record if you apply .deleteRealmIfMigrationNeeded(), so if you want to need DB data remains as it is nee to manage migration on your DB

The user updated to the latest version where the the realm config is the one posted above:

RealmConfiguration encryptedConfig = new RealmConfiguration.Builder()
                .name("name")
                .schemaVersion(6)
                .encryptionKey(hash)
                .migration(new RealmMigrationHelper())
                .build();
        Realm.removeDefaultConfiguration();
        Realm.setDefaultConfiguration(encryptedConfig);
        return encryptedConfig;
Was this page helpful?
0 / 5 - 0 ratings

Related issues

harshvishu picture harshvishu  Â·  3Comments

AlbertVilaCalvo picture AlbertVilaCalvo  Â·  3Comments

AAChartModel picture AAChartModel  Â·  3Comments

yuwu picture yuwu  Â·  3Comments

jjorian picture jjorian  Â·  3Comments