使用Realm时,设定好model类,直接使用Realm.getDefaultInstance()就可以直接创建跟model类相对应的表格。但有时候需要更新表格或添加或减少表格,就要更新model类了。但直接更新model类是不行的,会报错,要进行migrate迁移操作才能成功更新图表。
另外,还没用过realm的同学们可以参考https://blog.csdn.net/amberoot/article/details/89949018来查看基本使用方法。
一、修改好model类后,创建MyMigration类(具体操作说明请看注释)
public class MyMigration implements RealmMigration {
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
//获取可编辑的图表schema
RealmSchema schema = realm.getSchema();
// (初始版本号是0)从版本0迁移到版本1 --> 添加一个新的model类
// 新建的model类Person:
// public Person extends RealmObject {
// private String name;
// private int age;
// // getters和setters省略
// }
if (oldVersion == 0) {
schema.create("ClassSetting")
.addField("Name", String.class);
.addField("age", int.class);
oldVersion++;
}
// 从版本1迁移到版本2 --> 添加一个主键id + RealmObject + RealmList
// model类Person:
// public Person extends RealmObject {
// private String name;
// private int age;
// @PrimaryKey
// private long 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++;
}
}
}
二、迁移操作(只需要操作一次)
Realm realm;
//配置realm,当前schema版本为1
RealmConfiguration config0 = new RealmConfiguration.Builder()
.name("default.realm")
.schemaVersion(1)
.build();
// 进行迁移操作,从0到1
try {
Realm.migrateRealm(config0, new MyMigration());
} catch (FileNotFoundException ignored) {
//如果realm文件不存在,直接忽略
}
realm = Realm.getInstance(config0);
三、迁移操作完成后,创建realm实例的时候都要用自定义配置,不能直接用默认配置Realm.getDefaultInstance()
Realm realm;
//配置realm,当前schema版本为1
RealmConfiguration config0 = new RealmConfiguration.Builder()
.name("default.realm")
.schemaVersion(1)
.build();
//获取realm的实例
realm = Realm.getInstance(config0);