Realm(Java)數據庫使用文檔(遷移Migrations)

Realm(Java)數據庫使用文檔(目錄)

使用任何數據庫時,您的model類(即數據庫架構)很可能會隨着時間而改變。由於Realm中的model類被定義爲標準對象,因此更改架構就像更改相應RealmObject子類的接口一樣容易。

9.1 本地遷移

對於未同步到服務端的Realms,執行遷移需要對RealmConfiguration進行兩項更改:設置新的架構版本,以及編寫代碼以執行遷移。

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

使用此功能,遷移代碼將在需要時自動運行。我們提供了內置方法,因此您可以升級磁盤上的架構以及爲該架構的早期版本存儲的數據。

// 示例遷移添加新類
public class MyMigration implements RealmMigration {

  @Override
  public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {

     // DynamicRealm公開了可編輯的架構
     RealmSchema schema = realm.getSchema();

     // 遷移至版本1:添加新類。
     // 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++;
     }

     // 遷移到版本2:添加主鍵+對象引用
     // Example:
     // public Person extends RealmObject {
     //     private String name;
     //     private int age;
     //     @PrimaryKey
     //     private int id;
     //     private Dog favoriteDog;
     //     private RealmList<Dog> dogs;
     //     // getters and setters left out for brevity
     // }
     
     if (oldVersion == 1) {
        schema.get("Person")
            .addField("id", long.class, FieldAttribute.PRIMARY_KEY)
            .addRealmObjectField("favoriteDog", schema.get("Dog"))
            .addRealmListField("dogs", schema.get("Dog"));
        oldVersion++;
     }
  }
}

有關更多詳細信息,請參見我們的遷移示例App

如果Realm啓動時磁盤上沒有文件,則不需要遷移,Realm會根據代碼中定義的最新models創建一個新的.realm文件和架構。 這意味着,如果您正在開發中並且經常更改架構(並且可以丟失所有數據),則可以刪除磁盤上的.realm文件,而不必編寫遷移文件。在應用程序開發週期的早期對模型進行修補時,這可能會有所幫助。

RealmConfiguration config = new RealmConfiguration.Builder()
    .deleteRealmIfMigrationNeeded()
    .build()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章