2012-06-10 22 views
2

要在覈心數據創建一個管理對象:如何取消刪除在Core Data中標記爲刪除的被管理對象?

NSManagedObject *aManagedObject = [NSEntityDescription 
insertNewObjectForEntityForName:@"Employee" 
inManagedObjectContext:aContext]; 

要刪除管理對象,將消息發送到它的管理對象上下文。

[aContext deleteObject:aManagedObject]; 

這種方法將消息發送到aManagedObject

- (void)prepareForDeletion 

這裏是我的問題。我將這些數據與外部數據庫同步。我有一個名爲「刪除」的屬性。當一個對象第一次被「刪除」時,我想將「已刪除」屬性設置爲YES,稍後將其同步到它被刪除的外部數據庫。在未來某個日期,所有「已刪除」== YES實體將過期並真正被刪除。

在prepareForDeletion我想測試,看是否:

  • dateSynced> = dateModified
  • dateSynced < = EXPIRATIONDATE
  • 「刪除」 ==是

真正刪除object,else:

  • dateModified =現在
  • 「刪除」= YES
  • ,使其刪除

有沒有一種方法,使在這一點上不能刪除?

或者,我不應該嘗試使用prepareForDeletion來覆蓋deleteObject,只是創建一個新的方法,比如obsoleteObject來設置「deleted」= YES和dateModified = Now,並且以後只使用deleteObject進行清除?

回答

0

我想,你不能這樣做。我這樣做 - 在刪除對象時,我將它存儲爲對象ID(在我的情況下,它的GUID存儲爲文件),並在同步時將刪除操作推送到服務器。

1

我最近實現了這樣的機制。

一旦標記爲刪除,您不能延遲實體刪除。它將在下次保存上下文時被刪除。你必須依靠別的東西來保持同步。

這是我的解決方案。我創建了一個事件的持久記錄,其中一些是刪除事件。當一個實體被標記爲刪除時,我創建了一個對應的日誌條目(實際上是在另一個上下文中保存的,它保存在刪除對象的上下文之前,以確保日誌條目保持最新並在實際刪除之前保存)。該日誌稍後處理,並向服務器發出刪除命令。如果日誌已保存,但刪除的實體不會因​​爲崩潰而被刪除,則下次啓動應用程序時,會處理日誌,同時在本地和遠程刪除實體,並且一切正常。

聽起來很複雜,但它並沒有在實踐中。

0

我會不是建議這樣做,但有一種方法可以從Core Data中「取消刪除」一個對象。這可能不是你想要的。

只需調用insert(object)與您想要取消刪除的對象應該做的伎倆。如果對象刪除未保存在上下文中,則必須先撥打processPendingChanges()

重要:在恢復刪除後,你還必須將所有可能處理未決的改變時,已經應用(或當背景一直是對象的屬性,也取消刪除所有級聯刪除的保存)。

請記住這是一件很危險的事!你應該避免這樣做。

我在iOS 10上保存之前測試了undelete。

相關問題