自定义核心数据删除操作

时间:2012-05-12 14:44:26

标签: objective-c core-data cascading-deletes

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

Company <<----->> Department(多对多)(例如,人力资源部门对所有公司都很普遍)

Department <---->> Employee

Company <----->> Employee

设置示例,

John(employee1)隶属于BSKYU公司并从事市场营销工作) Jason(employee2)隶属于IBC Compnay,在金融部门工作) **注意:市场营销对John和Jason都很普遍。

我想开发一个删除例程,

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

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

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

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

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

任何帮助表示赞赏。谢谢

1 个答案:

答案 0 :(得分: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];
    }

`

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

enter image description here

但是如果你开始说,我希望只有当“员工单腿,在工作,但在咖啡室,除非大老板正在度假,然后你必须编码它”时才要删除它。

来自核心数据编程指南:

  

关系删除规则

     

关系的删除规则指定在尝试删除源对象时应该发生什么。请注意上一句中的措辞 - “如果有人企图......”。如果将关系的删除规则设置为“拒绝”,则可能不会删除源对象。再考虑一个部门的员工关系,以及不同删除规则的影响。

     

拒绝

     

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

     

抵消

     

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

     

级联

     

删除关系目的地的对象。   例如,如果删除部门,则同时解雇该部门中的所有员工。

     

无行动

     

对关系目的地的对象不执行任何操作。   例如,如果您删除某个部门,请将所有员工保持原样,即使他们仍然认为他们属于该部门。

     

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

     

如果使用“无操作”规则,则需要确保维护对象图的一致性。您有责任将任何反向关系设置为有意义的值。在您有多对多关系并且目的地可能有大量对象的情况下,这可能是有益的。

来源:Core Data Programming Guide