2017-06-12 49 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

相關問題