2017-02-26 49 views
0

我從多個遠程文件中的一個讀取數據到coredata。如果更改遠程文件,則核心數據中的數據需要更新。例如,假設一個文件充滿部門,另一個充滿員工。 隨着公司重組,一個部門被重新命名,第二個沒有員工的部門被刪除。員工文件沒有更改,所以我只想重新讀取部門的文件。在我的代碼中,我讀取文件,從coredata中獲取部門並更新其名稱屬性。但由於第二部門不在文件中,我想從核心數據中刪除它。 我的僞代碼解決方案如下:從核心數據中刪除多餘數據的有效方法

  • 部門實體得到了hasChanged從文件中讀取之前的屬性
  • ,所有hasChanged屬性設置爲false
  • 如果一個部門是存在於文件中,其hasChanged屬性設置爲true
  • 讀取文件後,用hasChanged各部門屬性設置爲false被取出,並刪除

不知何故,似乎不是很有效率。刪除所有部門並構建新部門似乎效率不高,因爲核心數據將刪除所有部門的員工,現在我必須重新讀取員工(也可能是所有其他文件)。

有沒有更好的方法來解決這個數據變得多餘的問題?如果你用代碼回答,swift更可取。

+0

員工和公司是否有唯一的ID?實際上是 –

+0

部門,但是他們確實如此。 – KvdLingen

+0

你在控制服務器的api嗎?會暗示與服務器的API應該只返回變化的變化是毫無意義的,因爲你無法控制它。 –

回答

0

首先刪除規則不應該級聯 - 將其更改爲無效。 當你從服務器獲取新數據請按照下列步驟操作:

  1. 取所影響的實體所有。如果您正在更新部門 - 然後獲取所有部門
  2. 將結果存儲在ID是密鑰的字典中。
  3. 還將所有結果存儲在一個可變集合中,稱爲objectsToDelete
  4. 現在遍歷從服務器獲得的所有數據。使用您在步驟#2中創建的字典查找部門。如果找到該對象,則更新它並將其從步驟#3中創建的集合中刪除。如果你沒有找到對象,然後創建它。
  5. 如果在objectsToDelete中還有任何物品,請刪除它們
  6. 保存上下文。

這對員工是一樣的原則。你匹配你已經使用的字典,並刪除那些不匹配的。