领域迁移问题

时间:2016-02-03 20:56:39

标签: android realm

我遇到了让Realm成功迁移的问题,并且可以在几周内修补它一点点帮助..

我有一个领域数据库工作,我的意思是保存数据和返回数据。

假设我想添加一个新字段“username”。我更新我的RealmObject代码以使用新字段。在我的App.java中,我然后使用:

   System.out.println("Configuring Realm...");
   RealmConfiguration config1 = new RealmConfiguration.Builder(this)
            .schemaVersion(1)
            .migration(new Migration())
            .build();
   realm = Realm.getInstance(config1);
   realm.close();

我的Migration.java看起来像:

public class Migration implements RealmMigration {
    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
        RealmSchema schema = realm.getSchema();
        RealmObjectSchema theSchema = schema.get("RealmStore");
        System.out.println("Realm version is " + oldVersion);
        if (oldVersion == 0) {
            theSchema
                    .addField("username", String.class);
            oldVersion++;
            System.out.println("Realm migrated from 0 to 1");
        }
    }
}

我运行应用程序并给出以下输出:

I/System.out: Configuring Realm...
I/System.out: Realm version is 0
I/System.out: Realm migrated from 0 to 1

一切都好!除了..!当您重新运行该应用程序时,您现在收到以下错误:

E/AndroidRuntime: FATAL EXCEPTION: main
E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rh.realmy/com.rh.realmy.Main}: java.lang.IllegalArgumentException: Realm on disk is newer than the one specified: v1 vs. v0

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

问题在于您要调用的代码的其他部分Realm.getInstance(context)

这相当于执行以下操作:

RealmConfiguration config = new RealmConfiguration.Builder(context).schemaVersion(0).build();
Realm realm = Realm.getInstance(config);

这将为您提供您所看到的架构不匹配错误。

您可以在此处详细了解默认配置:https://realm.io/docs/java/latest/#the-default-realm

答案 1 :(得分:2)

Kohi:

这是我最后使用的代码(有效)......

在我的App.java中:

private Realm realm;
@Override
public void onCreate() {
    super.onCreate();

    // Setup Realm
    RealmConfiguration config1 = new RealmConfiguration.Builder(this)
            .schemaVersion(0)
            .migration(new Migration())
            .build();
    realm = Realm.getInstance(config1); // Automatically run migration if needed
    Realm.setDefaultConfiguration(config1);
    realm.close();
    }
}

在我使用领域的课程中:

private Realm realm;
@Override
protected void onCreate(Bundle savedInstanceState) {
// Open the default Realm for the UI thread.
    realm = Realm.getDefaultInstance();
}

然后根据需要使用领域

希望这有帮助

相关问题