目標:我想查一個管理對象,以確保它是好的刪除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");
}
輸出:
可以刪除員工
可以刪除員工
可以刪除員工
可以刪除員工
可以刪除員工
可以刪除員工
可以刪除員工
可以刪除員工
可以刪除員工
能刪除員工
警告:無法刪除部門
令我驚訝的是,canDelete
是NO
。當員工對象無效時,爲什麼部門對象無效刪除?錯誤返回包含以下(略)
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上設置了一個小樣本項目,它說明了我的發現與生產代碼和單元測試。
如果您需要在刪除對象之前使用自定義驗證,那麼此方法很有用。所以,你可以覆蓋它來添加你的自定義刪除邏輯。如果你這樣做,你應該調用超類實現。 –
關於你的模型,我無法理解兩件事。首先,如果你有一對多的關係,一個僱員怎麼能屬於更多的部門呢?其次,您應該將員工建模爲級聯,而部門將無效。看看http://stackoverflow.com/questions/15232092/setting-up-a-parent-child-relationship-in-core-data/15233763#15233763。 –
'部門<<--->>員工'我去了員工/部門,因爲這是最常用的例子。你是對的,作爲一個問題領域,它沒有邏輯意義 - 這只是一個例子,爲了清晰起見。 :-) – edelaney05