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.
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;
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);
}