2017-08-16 96 views
0

我有一个已经使用领域数据库的应用程序。我现在想要添加一个新的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因为我们已经定义了一个方法哪些领域应该属于新的类有

+2

*我的问题在这里:我们是否真的需要在这里创建Person模式“手动”(即添加字段,使用它们的类型)吗?*是 –

+0

我想这对你有所帮助: https://medium.com/@ budioktaviyans/Android的境界,迁移架构4fcef6c61e82 – Yoni

回答

2

我的问题在这里:我们真的需要“手动”创建人模式(即加这些领域,他们的类型)在这里?

是的。

还是有使用人RealmObject因为我们已经定义了一个方法哪些领域应该属于新的类有

其实我谈过这与基督教梅尔基奥尔here,但问题与使用现有RealmModel类定义你需要添加和你字段你需要删除哪些字段是:

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

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

基本上,使用当前版本的Realm模型来定义模式修改操作不是未来的保证。 (基于反射和当前RealmModel类)


我已经尝试了定义各种“auto migration”,但考虑到重命名字段会导致去除“老场”,并加入中间没有转化的“新领域”;它不会在你必须保留的现有数据集上工作得很好!也可以在当时用deleteIfMigrationNeeded()重新创建模式。