2016-05-23 97 views
0

我用ObjectMapper映射我的對象,這些對象由Alamofire提供並將它們保存在Realm中。ObjectMapper + Realm + Alamofire

Everthing工作正常。但是,如何刪除存在於Realm中但已在我的Web服務中刪除的對象?

更新:根據下面我的答案目前使用此代碼結束:

if let overviewItemsArray = response.result.value{ 

        do{ 
         try self.realm.write{ 
          self.realm.delete(self.realm.objects(OverviewItem)) 
          self.realm.add(overviewItemsArray, update: true) 
         } 
        } 
        catch let err as NSError { 
         logger.error("Error with realm: \(err.localizedDescription)") 
        } 
        overviewItemsAsList.removeAll() 
        overviewItemsAsList.appendContentsOf(self.realm.objects(OverviewItem) 
         .sorted("sortOrder", ascending: true)) 
        successHandler(overviewItemsAsList) 
       } 

也許有人有進一步的輸入如何改進這一點。我有10個這種類型的對象。但在其他物體上,我得到1500件物品。

回答

1

我終於想通了,它工作得很好。我計算緩存數據和新數據的差異並將其刪除:

private func deleteOrphans(existingData: List<VotingHeader>, fetchedData:[VotingHeader]){ 

     guard existingData.count>0 else { 
      return 
     } 

     let existingIDs = Set(existingData.map({$0.votingID})) 
     let incomingIDs = fetchedData.map({$0.votingID}) 
     let idsToDelete = existingIDs.subtract(incomingIDs) 

     if idsToDelete.count>0{ 
      let itemsToDelete = self.realm.objects(VotingHeader).filter("votingID IN %@",idsToDelete) 

      try! self.realm.write{ 
       self.realm.delete(itemsToDelete) 
      } 
     } 
    } 
0

,你可以:

次使用的updated_at欄,並通過ID更新場,之後刪除尚未更新的所有對象或

-delete所有對象,然後再插入新的(昂貴,我不會做這樣的事情)

我認爲你應該去第一個選項,特別是如果你有很多的數據,當你從web服務得到你的響應,通過每一個並更新數據庫中相應的記錄與NSDate()和之後,刪除「舊」的對象。請注意,這不是來自服務器的updated_at,而是您的本地存儲。

如果你有少量的數據,並且你確定它會很快又便宜,那麼另一個就可以。

+0

有沒有解決方案之一的框架?也許Objectmapper? – netshark1000

+0

我不認爲有,但也許有人確實知道更好的方法。編輯時可能會出現類似的問題:你想採用哪一邊:) 對於1500條記錄,我會在你的realm對象中推薦這個updated_at字段。 – Miknash

0

這聽起來像您需要實施某種機制來確定哪些對象在服務器上被刪除,並明確地將該信息中繼到本地設備以反映該更改。我能想到的幾個可能的解決方案:

  • 如果你有API的控制,可以實現您的設備告訴服務器,當它最後調用API的時間戳的系統和服務器可以再返回其響應中的ID號列表,以便在那段時間之後刪除的條目。

  • 如果您每次只是下載相同的列表,而不是每次都刪除Realm文件中的所有內容,請通過Realm文件中的每個條目執行手動循環,並查看它是否在下載列表。如果沒有,請刪除它。當然,這仍然是一個相對緩慢的操作,但是它比每次刪除/重新創建任何東西要快得多。

  • 因爲聽起來像Realm在這裏被用來緩存服務器信息,所以你可以在Realm對象上設置一個非常嚴格的失效時間,如果它超出了就會刪除它們,或者如果對象從服務器。

我希望有幫助!