2017-06-12 85 views
2

在我的项目中,我使用Realm来存储来自API的数据。 在将对象更新为Realm之前,我想检查哪些对象是新的(数据库中不存在)以及哪些对象应该被删除(存在于数据库中,但不存在于API响应中)。检测要从Realm数据库中删除的对象

为了检查我通过API响应迭代的新对象,并用简单的境界查询,以检查其对象是新的

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

经典同步问题。一个理想的解决方案是让你的后端通知你的应用程序,当一个项目被删除,所以应用程序可以更新其本地分区 – Pelocho

回答

1

我有删除不API响应,这是我添加一个索引字段名为@Index private boolean isBeingSaved;我RealmObject对象一个相当不错的伎俩:

public class Thingy extends RealmObject { 
    //... 
    @Index 
    private boolean isBeingSaved; 
} 

然后我映射到RealmObjects API响应,我此设置为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,我想你不希望立即删除它们,但是这是我做到了,当我需要这个功能。

+0

非常感谢! – AKZB

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

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

+0

感谢您的答复。我知道我可以删除一切或特定对象,但那不是我问题的关键。 – AKZB

+0

你能解释一下吗?对我来说,如果你要删除API响应中不存在的所有本地数据库行,那么听起来你可以删除所有内容,并将api响应保存到数据库。这样做会更快,然后遍历当前的对象,并且只保存所需的内容,然后保存API响应的所有内容。 –

+0

我想知道哪些行应该被删除,因为我不想删除它们。我想为这些行设置一个特殊标志。 – AKZB

相关问题