我有这个课程
class Student extends RealmObject {
public String code;
public String name;
public String email;
public Course course;
}
class Course extends RealmObject {
public String code;
public String name;
}
class Sync {
// ...
// To sync data I am using retrofit, look the method to update course
public void onResponse(Call<...> call, Response<...> response) {
if (response.isSuccessful()) {
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.delete(Course.class);
realm.copyToRealm(response.body());
}
});
}
}
}
调用Sync以更新课程后,所有Student对象的课程设置为null,这是调用realm delete后的预期行为吗? 即使在再次填充表格之后,Student上的课程仍为空。
今天我在代码上做了这个改动:
class Course extends RealmObject {
@PrimaryKey
public String code;
public String name;
}
class Sync {
// ...
// To sync data I am using retrofit, look the method to update course
public void onResponse(Call<...> call, Response<...> response) {
if (response.isSuccessful()) {
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.copyToRealmOrUpdate(response.body());
}
});
}
}
}
我这样做太晚了,以免删除课程。
我可以做些什么来恢复参考课程并再次将其设置给学生?
谢谢。
答案 0 :(得分:1)
这是预期的行为,因为您通过删除指向的对象来使对象链接无效。
要恢复它们,您必须再次设置链接。
另一种解决方案是不删除您仍需要的课程。如果您使用code
注释@PrimaryKey
,就可以“更新”已经存在的课程。然后问题就是删除不再在回复中的课程/学生,而是{{ 3}}
public class Robject extends RealmObject {
@PrimaryKey
private String code;
@Index
private String name;
//...
@Index
private boolean isBeingSaved;
//getters, setters
}
和
// background thread
Realm realm = null;
try {
realm = Realm.getDefaultInstance();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Robject robject = new Robject();
for(Some some : somethings) {
robject.set(some....);
realm.insertOrUpdate(robject);
}
realm.where(Robject.class)
.equalTo(Robject.IS_BEING_SAVED, false) // compile 'dk.ilios:realmfieldnameshelper:1.1.0'
.findAll()
.deleteAllFromRealm(); // delete all non-saved data
for(Robject robject : realm.where(Robject.class).findAll()) { // realm 0.89.0+
robject.setIsBeingSaved(false); // reset all save state
}
}
});
} finally {
if(realm != null) {
realm.close();
}
}