使用任何數據庫時,您的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()