1

我有三个实体对象。这些实体之间的关系有点像三角恋!

Company <<----->> Department(多对多)(例如,人力资源部门对所有公司都是通用的)

Department <---->> Employee

Company <----->> Employee

树立榜样,

John (employee1) 属于 BSKYU 公司,从事市场营销工作) Jason (employee2) 属于 IBC Compnay,从事财务工作) **注意:市场营销对 John 和 Jason 来说都是通用的。

我想开发一个删除例程,这样,

deleting 公司将删除所有它Employees 我也想摆脱不属于任何“其他公司”的部门。因此,如果我删除 IBC 公司,它应该删除 Jason(我猜是通过级联),并且仅当 IBC 是唯一拥有财务部门的公司时,才能摆脱财务部门。我不知何故需要检查 Finance.company == [零结果] 如果是,请将其删除。

DELETINGDEPARTMENT将删除its Employees之前选择的属于 A 公司的所有内容!假设一家公司已被选中,我会如果我删除一个部门,比如人力资源部,我还想删除该部门内属于选定公司的所有员工

我的问题是,“在哪里”我应该处理这样的删除规则,这会遇到,但我不知道如何处理它:

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

处理删除的最有效方法是什么,根据上述规则检查是否需要删除的所有内容应该是。

任何帮助表示赞赏。谢谢

4

1 回答 1

1

您必须自己使用正确的谓词,您可以使用下面的示例代码作为起点,但您必须提供上下文、谓词等。

删除规则可以很好地确保数据完整性,但如果您有特殊情况,您必须获取对象并手动删除它们。

`// 创建获取请求

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext];
[request setEntity:entity]; 

// Ignore property values for maximum performance
[request setIncludesPropertyValues:NO];

// If a predicate was specified then use it in the request
if (predicate != nil)
    [request setPredicate:predicate];

// Execute the count request
NSError *error = nil;
NSArray *fetchResults = [managedObjectContext executeFetchRequest:request error:&error];

// Delete the objects returned if the results weren't nil
if (fetchResults != nil) {
    for (NSManagedObject *manObj in fetchResults) {
        [managedObjectContext deleteObject:manObj];
    }

`

除此之外,在关系的数据模型检查器中,您可以指定删除规则:

在此处输入图像描述

但是,如果您开始说,我希望仅在“员工是一条腿,在工作,但在咖啡厅,除非大老板在假期,否则您必须对其进行编码”时才将其删除。

从核心数据编程指南:

关系删除规则

关系的删除规则指定如果尝试删除源对象会发生什么。请注意前一句中的措辞——“如果尝试……”。如果关系的删除规则设置为拒绝,则可能不会删除源对象。再次考虑一个部门的员工关系,以及不同删除规则的影响。

否定

如果关系目的地至少有一个对象,则无法删除源对象。例如,如果您要删除一个部门,您必须确保该部门的所有员工都首先转移到其他地方(或解雇!)否则无法删除该部门。

无效化

将目标对象的反向关系设置为空。例如,如果您删除一个部门,请将所有当前成员的部门设置为空。仅当员工的部门关系是可选的,或者您确保在下一次保存操作之前为每个员工设置了一个新部门时,这才有意义。

级联

删除关系目标处的对象。例如,如果您删除一个部门,请同时解雇该部门的所有员工。

无动作

对关系目的地的对象不做任何事情。例如,如果您删除一个部门,请让所有员工保持原样,即使他们仍然认为自己属于该部门。

应该清楚的是,这些规则中的前三个在不同的情况下是有用的。对于任何给定的关系,您可以根据业务逻辑选择最合适的关系。使用无操作规则的原因不太明显,因为如果使用它,您可能会使对象图处于不一致的状态(员工与已删除的部门有关系)。

如果您使用 No Action 规则,则由您来确保保持对象图的一致性。您负责将任何反向关系设置为有意义的值。在您具有一对多关系并且目的地可能有大量对象的情况下,这可能会有所帮助。

来源:核心数据编程指南

于 2012-05-12T14:53:25.060 回答