如何在关系中删除领域?

时间:2016-11-29 13:38:07

标签: android realm

我有这个课程

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());
                }
            });
        }
    }
}

我这样做太晚了,以免删除课程。

我可以做些什么来恢复参考课程并再次将其设置给学生?

谢谢。

1 个答案:

答案 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();
    }
}