使用任何数据库时,您的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()