在我的项目中,我使用Realm存储来自API的数据。 在将对象更新为Realm之前,我想检查哪些对象是新的(数据库中不存在)以及应删除哪些对象(存在于数据库中,但不存在于API响应中)。
为了检查新对象,我正在迭代API响应并使用简单的Realm查询来检查哪个对象是新的
for(Follower follower: results.data){
Follower followerFromDb = realm.where(Follower.class).equalTo("id", follower.id).findFirst();
if(followerFromDb == null){
Log.d("REALM", "Object is not in the DB");
}
}
我的问题是 - 如何有效地检查应该从数据库中删除哪些对象。
答案 0 :(得分:2)
我有一个非常好的技巧来删除不在API响应中的对象,这就是我向我的RealmObject添加一个名为@Index private boolean isBeingSaved;
的索引字段:
public class Thingy extends RealmObject {
//...
@Index
private boolean isBeingSaved;
}
然后,当我将API响应映射到RealmObjects时,我将其设置为true
:
ApiResponse apiResponse = retrofitService.getSomething();
Thingy thingy = new Thingy();
thingy.set/*...*/;
thingy.setIsBeingSaved(true);
realm.insertOrUpdate(thingy);
之后,您已将每个元素设置为true
以获取新元素。所以你可以删除所有错误的内容。
realm.where(Thingy.class)
.equalTo(ThingyFields.IS_BEING_SAVED, false)
.findAll()
.deleteAllFromRealm();
然后你需要迭代剩下的对象并将它们的布尔字段设置为false
for(Thingy thingy: realm.where(Thingy.class).findAll()) {
thingy.setIsBeingSaved(false);
}
它有效!
遗憾的是,我不知道更优化的解决方案,我可以清楚地看到这是O(N)
因为最后的迭代。但您可以按https://github.com/realm/realm-java/issues/762进行批量更新支持。
在你的特殊情况下,特殊标志是isBeingSaved
,我想你不想立即删除它们,但这就是我在需要这个功能时的做法。
答案 1 :(得分:0)
听起来你的数据库只包含来自API的数据,并且当返回api调用响应时本地数据是defunkt。如果是这种情况,那么您只需删除数据库中的所有内容,并将api响应中的所有内容添加到Realm
。
Realm realm = Realm.getDefaultInstance();
realm.executeTransaction(new Realm.Transaction() {
public void execute(Realm realm) {
realm.deleteAll(); //Delete everything
object.delete(); //Delete specific object
realm.delete(RealmModel) //Delete all of specific type
}
}
记得在完成后关闭你的领域。