我遇到了让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
有什么想法吗?
答案 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();
}
然后根据需要使用领域
希望这有帮助