【问题标题】:RealmMigrationNeededException when PrimaryKey is added/removed添加/删除 PrimaryKey 时的 RealmMigrationNeededException
【发布时间】:2018-02-26 08:44:46
【问题描述】:

这是我的领域配置代码。 问题是,当我删除或添加任何 PrimaryKey 时,我会收到 RealmMigrationNeededException 异常。

预先升级Info.class、RealmApplication.class

public class UpgradeInfo extends RealmObject{

    @SerializedName("version")
    @PrimaryKey
    private int versionCode;

    @SerializedName("version_name")
    private String versionName;
}

public class RealmApplication extends MultiDexApplication {

    @Override 
    public void onCreate() {
        Realm.init(this);
        RealmConfiguration config = new RealmConfiguration.Builder()
                .schemaVersion(1)
                .build();
        Realm.setDefaultConfiguration(config);
    }
}

新的 UpgradeInfo.class,RealmApplication.class

public class UpgradeInfo extends RealmObject{

    @PrimaryKey
    private String packageName

    @SerializedName("version")
    private int versionCode;

    @SerializedName("version_name")
    private String versionName;
}

public class RealmApplication extends MultiDexApplication {

    @Override 
    public void onCreate() {
        Realm.init(this);
        RealmConfiguration config = new RealmConfiguration.Builder()
                .schemaVersion(2)
                .migration(new Migration())
                .build();
        Realm.setDefaultConfiguration(config);
    }
}

public class ZNJRealmMigration implements RealmMigration {

    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
        RealmSchema schema = realm.getSchema();
        if (oldVersion == 1) {
                     schema.get("UpgradeInfo").removePrimaryKey().addField("packageName", String.class).addPrimaryKey("packageName");

        }
    }
}

这里出现了这个错误:

java.lang.RuntimeException: Unable to stop activity {com.example.realm/com.example.realm.main.ui.MainActivity}:
 io.realm.exceptions.RealmMigrationNeededException:
Migration is required due to the following errors:
- Primary Key for class 'UpgradeInfo' has been added.
        at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3668)
        at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3722)
        at android.app.ActivityThread.access$1100(ActivityThread.java:182)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1522)
        at android.os.Handler.dispatchMessage(Handler.java:111)
        at android.os.Looper.loop(Looper.java:194)
        at android.app.ActivityThread.main(ActivityThread.java:5682)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:963)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:758)
Caused by: io.realm.exceptions.RealmMigrationNeededException: Migration is required due to the following errors:
- Primary Key for class 'UpgradeInfo' has been added.
        at io.realm.internal.OsSharedRealm.nativeGetSharedRealm(Native Method)
        at io.realm.internal.OsSharedRealm.<init>(OsSharedRealm.java:184)
        at io.realm.internal.OsSharedRealm.getInstance(OsSharedRealm.java:254)
        at io.realm.BaseRealm.<init>(BaseRealm.java:124)
        at io.realm.BaseRealm.<init>(BaseRealm.java:93)
        at io.realm.Realm.<init>(Realm.java:153)
        at io.realm.Realm.createInstance(Realm.java:424)
        at io.realm.RealmCache.doCreateRealmOrGetFromCache(RealmCache.java:342)
        at io.realm.RealmCache.createRealmOrGetFromCache(RealmCache.java:282)
        at io.realm.Realm.getDefaultInstance(Realm.java:332)
        at com.example.realm.db.RealmHelper.<init>(RealmHelper.java:35)
        at com.example.realm.db.RealmHelper.getInstance(RealmHelper.java:45)
        at com.example.realm.util.Util.closeRealm(Util.java:181)
        at com.example.realm.main.ui.MainActivity.onStop(MainActivity.java:82)
        at android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1288)
        at android.app.Activity.performStop(Activity.java:6328)
        at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3665)
        ... 10 more

【问题讨论】:

  • Constants.VERSION_CODE = 2
  • 尝试用addField("packageName", String.class, FieldAttribute.PRIMARY_KEY)替换你的addField声明
  • 您确定它以前是 schemaVersion 1 而不是 schemaVersion 0?默认架构版本为 0。

标签: android realm realm-migration


【解决方案1】:

当您创建没有架构版本的 RealmConfiguration 时,其架构版本设置为 0

所以您的代码很可能无法正常工作,因为:

  1. 您正在使用没有迁移集的其他配置

  2. 您的架构版本曾经是 0 而不是 1,因此您实际上并未执行会更改主键的架构操作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    相关资源
    最近更新 更多