2013-12-21 23 views
4

目標:我想查一個管理對象,以確保它是好的刪除CoreData - 如何使用validateForDelete:確定一個管理對象應該被刪除

後市展望:-[NSManagedObject validateForDelete:]應該返回一個基於在被管理對象模型中的刪除規則設置BOOL


NSManagedObject類參考

validateForDelete:

確定是否接收器可以在其當前狀態被刪除。

- (BOOL)validateForDelete:(NSError **)error

參數

錯誤

如果接收器不能在當前狀態下被刪除,在返回包含了描述問題NSError的一個實例。

返回值

YES如果接收機可以在其當前狀態被刪除,否則NO

討論

的對象不能被它是否有關係,有「拒絕」刪除規則刪除,這種關係有一個目標對象。

NSManagedObject的實現發送接收器的實體描述,其基於值的存在或不存在基本檢查的消息。

讀這個我認爲我應該可以做這樣的事情:

BOOL canDelete = [myManagedObject validateForDelete:&error]; 

if (canDelete) { 
    [managedObjectContext deleteObject:myManagedObject]; 
} 
else { 
    [self requestUserFeedback]; 
} 

然而,這種方法幾乎總是返回NO


示例代碼

管理對象模型

Department 
- Attribute: name 
    - Value: String 
- Relationship: employees 
    - To Many 
    - Destination: Employee 
    - Delete Rule: Nullify 
    - Inverse: department 

Employee 
- Attribute: name 
    - Value: String 
- Relationship: department 
    - To One 
    - Destination: Department 
    - Delete Rule: Nullify 
    - Inverse: employees 

例如代碼:

NSManagedObject *department = [NSEntityDescription insertNewObjectForEntityForName:@"Department" inManagedObjectContext:self.managedObjectContext]; 

for (int i = 0; i < 10; i++) { 
    NSManagedObject *employee = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:self.managedObjectContext]; 
    [employee setValue:department forKey:@"department"]; 
    if ([employee validateForDelete:NULL]) { 
     NSLog(@"Can delete employee"); 
    } 
    else { 
     NSLog(@"WARNING: Cannot delete employee"); 
    } 
} 

NSError *error; 
BOOL canDelete = [department validateForDelete:&error]; 
if (canDelete) { 
    NSLog(@"Can delete department"); 
} 
else { 
    NSLog(@"WARNING: Cannot delete department"); 
} 

輸出:

可以刪除員工
可以刪除員工
可以刪除員工
可以刪除員工
可以刪除員工
可以刪除員工
可以刪除員工
可以刪除員工
可以刪除員工
能刪除員工
警告:無法刪除部門

令我驚訝的是,canDeleteNO。當員工對象無效時,爲什麼部門對象無效刪除?錯誤返回包含以下(略)

Error Domain=NSCocoaErrorDomain 
Code=1600 
UserInfo= <>{ 
    NSValidationErrorObject=< department object > 
    NSValidationErrorKey=employees 
    NSValidationErrorValue=Relationship 'employees' on managed object 
} 

所以,validateForDelete:沒有返回我所期望的多對多關係,但對於以一對一的關係返回預期值。但是,回到文檔第二:

的對象不能被刪除,如果它有關係具有[原文]一個「拒絕」刪除規則和關係有一個目標對象。

NSManagedObject的實現向接收者的實體描述發送一個消息,該消息根據值的存在或不存在來執行基本檢查。

這將調用validateForDelete:的默認實現的工作方式,並協同努力將注意力吸引到「拒絕」刪除規則。沒有提及無效或級聯刪除規則或一對多或多對多關係之間的差異。


進一步研究

谷歌搜索變成了this hit on the Apple Mailing List archives from 2009,基本上說:-[NSManagedObject validateForDelete:]是作爲子類的鉤子,你需要實現一個單獨的方法自己的邏輯,以確定是否有物體有效刪除。

什麼?這是真的?這不是這種方法的文檔將導致人們相信:

確定接收器是否可以刪除其當前狀態。


我們怎樣想檢查一個管理對象是在是好爲刪除的狀態?

我已經在GitHub上設置了一個小樣本項目,它說明了我的發現與生產代碼和單元測試。

+0

如果您需要在刪除對象之前使用自定義驗證,那麼此方法很有用。所以,你可以覆蓋它來添加你的自定義刪除邏輯。如果你這樣做,你應該調用超類實現。 –

+0

關於你的模型,我無法理解兩件事。首先,如果你有一對多的關係,一個僱員怎麼能屬於更多的部門呢?其次,您應該將員工建模爲級聯,而部門將無效。看看http://stackoverflow.com/questions/15232092/setting-up-a-parent-child-relationship-in-core-data/15233763#15233763。 –

+0

'部門<<--->>員工'我去了員工/部門,因爲這是最常用的例子。你是對的,作爲一個問題領域,它沒有邏輯意義 - 這只是一個例子,爲了清晰起見。 :-) – edelaney05

回答

0

我讀文檔的方式是你應該繼承它,但你的子類也應該先調用super,這樣如果在框架中有一個驗證,你也會捕獲它。

根據我的經驗,-validateForDelete:只會在拒絕規則上返回NO

我的建議是將關係規則設置爲「無動作」,然後在您的子類中實現邏輯。

在您的子類中,您可以檢查與部門/教室的關係,如果計數爲零,則返回YES。非常簡單的刪除驗證規則,無法在模型中實現。

相關問題