检测要从Realm数据库中删除的对象

时间:2017-06-12 08:47:08

标签: java android realm

在我的项目中,我使用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");
        }
}

我的问题是 - 如何有效地检查应该从数据库中删除哪些对象。

2 个答案:

答案 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
     }
}

记得在完成后关闭你的领域。