使用新架构进行域迁移

时间:2017-08-16 15:46:49

标签: java android realm realm-migration

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

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架构"" (即在这里添加字段及其类型)?或者有没有办法使用Person RealmObject,因为我们已经定义了哪些字段应属于那里的新类

1 个答案:

答案 0 :(得分:3)

  

我的问题是:我们是否真的需要手工制作人物模式"#34; (即在这里添加字段及其类型)?

  

或者有没有办法使用Person RealmObject,因为我们已经定义了哪些字段应属于那里的新类

我实际上和Christian Melchior here讨论了这个问题,但 问题 使用当前存在的RealmModel类来定义您需要添加哪些字段以及需要删除的字段是:

如果您进行了复杂的迁移(涉及renameField()transform()操作),则无法保证您从对象的V5定义到对象的V6的操作仍然可以执行,如果您的迁移基于稍后在架构版本V8中的域模型。

这实质上意味着考虑到RealmModels可能会发生变化,只需更新到最新模型"甚至可能导致数据丢失,您将引用不存在的字段,等等。

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

我已尝试定义" auto migration"排序(基于反射和您当前的RealmModel类),但考虑重命名一个字段将导致删除"旧字段",并添加"新字段"两者之间没有转变;它对你必须保留的现有数据集的效果不佳!也可以在那时用deleteIfMigrationNeeded()重新创建架构。