2017-08-16 127 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()重新創建模式。