我们使用Realm作为我们的应用程序。我们的应用已经发布。现在我想添加一个字段给我们的一个领域对象。所以我写了RealmMigration,我也写了一个。这里的问题是如何将这个Realm迁移应用到我的应用程序。我使用Realm.getInstance()获取领域实例,只要我想要的东西。请记住,Realm.getInstance()每次都在整个应用程序中使用,我想访问Realm数据库。做Realm迁移的正确方法Android
所以,我有点疑问如何应用此迁移?任何潜在客户都可能会有帮谢谢。
我的RealmMigration如下。
public class RealmMigrationClass implements RealmMigration {
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
if(oldVersion == 0) {
RealmSchema sessionSchema = realm.getSchema();
if(oldVersion == 0) {
RealmObjectSchema sessionObjSchema = sessionSchema.get("Session");
sessionObjSchema.addField("isSessionRecordingUploading", boolean.class, FieldAttribute.REQUIRED)
.transform(new RealmObjectSchema.Function() {
@Override
public void apply(DynamicRealmObject obj) {
obj.set("isSessionRecordingUploading", false);
}
});
sessionObjSchema.setNullable("isSessionRecordingUploading",false);
oldVersion++;
}
}
}
}
public class Session extends RealmObject {
@PrimaryKey
private String id;
@Required
private Date date;
private double latitude;
private double longitude;
private String location;
private String note;
private String appVersion;
private String appType;
private String deviceModel;
private HeartRecording heart;
private TemperatureRecording temperature;
private LungsRecording lungs;
@NotNull
private boolean isSessionRecordingUploading;
private boolean sessionInfoUploaded;
private boolean lungsRecordingUploaded;
private boolean heartRecordingUploaded;
}
从RealmObject中删除了Getter和Setter以缩短问题。当我尝试重新安装应用程序而未卸载前一个应用程序时发生异常。请指教。
感谢Christian。如果我的理解是正确的,模型将有新创建的字段,并且所有Realm.getInstance(this)将是Realm.getInstance(config <像上面那样创建>) – User
是的,这是正确的。您应该使用'Realm.getDefaultInstance()'或'Realm.getInstance(RealmConfiguration)'而不是'Realm.getInstance(Context)'。 –
今天我尝试了,我得到了“io.realm.exceptions.RealmMigrationNeededException:Field'isSessionRecordingUploading'在现有的Realm文件中支持空值。使用相应的盒装类型作为字段'isSessionRecordingUploading'或使用io.realm.internal.Table .convertColumnToNotNullable()“。我稍微修改了RealmMigration类,并在Realm对象的字段中添加了notNull注释。但我仍然无法克服这个问题。我更新了Q. – User