首页 > 解决方案 > 每当我创建一个新的领域类时,我都会收到迁移错误?

问题描述

我创建了一个扩展 RealmObject 的类,每当我尝试运行该类时,我都会得到 runTime 异常,如下所示:

06-09 00:58:16.333 30719-30719/com.khaalijeb.inkdrops E/AndroidRuntime:致命异常:主进程:com.khaalijeb.inkdrops,PID:30719 io.realm.exceptions.RealmMigrationNeededException:由于以下错误: - 添加了“transactionacknowledgedata”类。在 io.realm.internal.OsSharedRealm.nativeGetSharedRealm(Native Method) 在 io.realm.internal.OsSharedRealm.(OsSharedRealm.java:171) 在 io.realm.internal.OsSharedRealm.getInstance(OsSharedRealm.java:241) 在 io。 realm.BaseRealm.(BaseRealm.java:136) 在 io.realm.BaseRealm.(BaseRealm.java:105) 在 io.realm.Realm.(Realm.java:164) 在 io.realm.Realm.createInstance(Realm. java:435) 在 io.realm.RealmCache.doCreateRealmOrGetFromCache(RealmCache.java:

我不知道为什么我会收到这个错误。有没有人遇到过这个问题?

标签: androidrealm

解决方案


记住在 SQLite 中你想添加一个表时,你必须这样做:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    int currentVersion = oldVersion;
    if(currentVersion == 1) {
        db.execSql("CREATE TABLE Blah(personId int, name varchar(255))");
        currentVersion++;
    }
    ...
}

等等?

好吧,Realm 不是 SQLite,但它仍然需要您修改架构以添加新的模型类并应用您想要的架构更改。

因此,您需要定义一个迁移(请参阅文档中有关它的整个部分)来处理从 X 到 Y 的架构版本更改。


因此,您创建了一个迁移:

public class Migration implements RealmMigration {

    @Override
    public void migrate(final DynamicRealm realm, long oldVersion, long newVersion) {
        ...
    }

    @Override
    public int hashCode() { return Migration.class.hashCode(); }

    @Override
    public boolean equals(Object obj) { return obj != null && obj instanceof Migration; }
}

Bump 架构版本并指定迁移到 RealmConfiguration

Realm.setDefaultConfiguration(new RealmConfiguration.Builder()
                                    .schemaVersion(currentVersion+1) // probably a constant somewhere
                                    .migration(new Migration())
                                    .build());

而且您实际上需要使用添加新添加的类的 DynamicRealm API 来编写迁移。

@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
    RealmSchema schema = realm.getSchema();
    if(oldVersion == 0) {
        RealmObjectSchema transactionacknowledgedata = 
                               schema.create("transactionacknowledgedata");
        transactionacknowledgedata.addField("name", String.class);
        oldVersion++;
    }
}


好吧,要么就是这样,要么你设置new RealmConfiguration.Builder().deleteIfMigrationNeeded().build(),只要有模型更改,你就会删除(并重新创建)领域。


推荐阅读