在应用程序中,存在一个领域数据库,其中包含初始数据和用户添加的数据。即使在更新后,用户添加的数据也应保留在设备上。初始数据通过
类添加public class RealmInitialData implements Realm.Transaction {
@Override
public void execute(Realm realm){
//initial data
Items item = new Items();
item.setName("Fragrance");
item.setTimestamp(System.currentTimeMillis());
realm.insertOrUpdate(item);
}
@Override
public int hashCode() {
return RealmInitialData.class.hashCode();
}
@Override
public boolean equals(Object obj) {
return obj != null && obj instanceof RealmInitialData;
}
}
配置(位于扩展Application类的类中)如下所示:
RealmConfiguration realmConfig = new RealmConfiguration.Builder()
.name("tasky.realm")
.schemaVersion(2)
.migration(new Migration())
.initialData(new RealmInitialData())
.build();
如果我更改/添加了RealmInitialData中的某些内容以进行更新,则用户应用程序上的数据不会更改。如何既更改初始数据(添加或重写某物)又不更改用户数据?
答案 0 :(得分:0)
您必须实现RealmMigration并将其传递给RealmConfiguration.Builder().migration()
。
像这样:
public class RealmMigrationAgent implements RealmMigration
{
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
RealmSchema schema = realm.getSchema();
if (oldVersion == 0) {
schema.get("InventDisableObject").addField("Reason", int.class);
oldVersion++;
}
if (oldVersion == 1) {
if (!schema.get("ActionObject").hasField("Annual"))
schema.get("ActionObject").addField("Annual", boolean.class);
oldVersion++;
}
if (oldVersion == 2) {
if (!schema.get("ActionObject").hasField("Hash"))
schema.get("ActionObject").addField("Hash", String.class);
if (!schema.get("ActionObject").hasField("Manual"))
schema.get("ActionObject").addField("Manual", boolean.class);
oldVersion++;
}
if (oldVersion == 3) {
if (!schema.get("OutletObject").hasField("Code"))
schema.get("OutletObject").addField("Code", String.class);
oldVersion++;
}
}
}
为每个新方案版本逐渐添加方案更新。
我可以看到由于迁移原因您有一些类Migration
-您可以提供它的代码吗?
答案 1 :(得分:0)
我遇到了同样的问题,我找到了解决方法。例如,如果您的新版本为7,请尝试在SharedRealm.getInstance(config).getSchemaVersion()
之前使用Realm.setDefaultConfiguration(config)
获取旧版本6,然后可以更新旧版本setDefaultConfiguration
之后的旧版本<7的领域数据。可能对您有帮助:
RealmConfiguration config = new RealmConfiguration.Builder()
.schemaVersion(7)
.migration(new RealmMigration() {
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
RealmSchema schema = realm.getSchema();
if(oldVersion == 6) {
schema.get("ImageRealm")
.addField("isSelected", Boolean.class, FieldAttribute.REQUIRED)
.addField("isLow", Boolean.class, FieldAttribute.REQUIRED);
oldVersion++;
}
}
}).build();
SharedRealm sharedRealm = SharedRealm.getInstance(config);
long oldVersion = sharedRealm.getSchemaVersion();
Realm.setDefaultConfiguration(config);
long newVersion = Realm.getDefaultInstance().getVersion();
// 如果有历史记录,更新状态
if (oldVersion < 7) {
Realm.getDefaultInstance().executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
RealmResults<DocRealmBean> allData = realm.where(DocRealmBean.class).findAll();
for (DocRealmBean bean : allData) {
bean.state = "0";
}
}
});
}