使用新架构的领域迁移

Realm migration with new schema

我有一个应用程序已经使用了领域数据库。我现在想向模式添加一个新的 RealmObject(假设我想添加 Person 作为我的新 RealmObject class)。从文档看来我需要执行以下操作才能完成这项工作:

RealmConfiguration config = new RealmConfiguration.Builder()
.schemaVersion(1) // Must be bumped when the schema changes
.migration(new MyMigration()) // Migration to run instead of throwing an exception
.build()




// Example migration adding a new class
class MyMigration extends RealmMigration {

  @Override
  public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
       // DynamicRealm exposes an editable schema
       RealmSchema schema = realm.getSchema();

       // Migrate to version 1: Add a new class.
       // Example:
       // public Person extends RealmObject {
       //     private String name;
       //     private int age;
       //     // getters and setters left out for brevity
       // }
       if (oldVersion == 0) {
          schema.create("Person")
              .addField("name", String.class)
              .addField("age", int.class);
          oldVersion++;
       }
       etc.... 

我的问题是:我们真的需要在这里创建 Person 架构 "by hand"(即添加字段及其类型)吗?或者有没有办法使用 Person RealmObject 因为我们已经在

中定义了哪些字段应该属于新的 class

My question here: do we really need to create the Person schema "by hand" (i.e. add the fields, with their type) here?

是的。

Or is there a way to use the Person RealmObject since we have already defined what fields should belong to the new class there

我实际上和 Christian Melchior here 谈过这个,但是问题 使用 当前存在的 RealmModel 类 用于定义您需要添加的字段和需要删除的字段是:

如果你有一个复杂的迁移(涉及renameField()transform()操作),那么不能保证你定义的从对象的V5到对象的V6的操作仍然是可能的做,如果你的迁移基于你在架构版本 V8 中的领域模型。

这实质上意味着考虑到 RealmModels 可能会发生变化,只是 "updating to the latest model" 甚至可能导致数据丢失,您将引用不存在的字段,等等。

基本上,使用当前版本的 Realm 模型来定义模式修改操作是面向未来的。