我有三个实体对象。这些实体之间的关系有点三角形!
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
处理删除的最有效方法是什么,检查是否需要根据上述规则删除所有内容。
任何帮助表示赞赏。谢谢
答案 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检查器中,您可以指定删除规则:
但是如果你开始说,我希望只有当“员工单腿,在工作,但在咖啡室,除非大老板正在度假,然后你必须编码它”时才要删除它。
来自核心数据编程指南:
关系删除规则
关系的删除规则指定在尝试删除源对象时应该发生什么。请注意上一句中的措辞 - “如果有人企图......”。如果将关系的删除规则设置为“拒绝”,则可能不会删除源对象。再考虑一个部门的员工关系,以及不同删除规则的影响。
拒绝
如果关系目标中至少有一个对象,则无法删除源对象。 例如,如果要删除部门,则必须确保该部门中的所有员工首先转移到其他地方(或被解雇!),否则无法删除部门。
抵消
将目标对象的反向关系设置为null。 例如,如果删除部门,请将所有当前成员的部门设置为null。只有当员工的部门关系是可选的,或者如果您确保在下一次保存操作之前为每个员工设置新部门时,这才有意义。
级联
删除关系目的地的对象。 例如,如果删除部门,则同时解雇该部门中的所有员工。
无行动
对关系目的地的对象不执行任何操作。 例如,如果您删除某个部门,请将所有员工保持原样,即使他们仍然认为他们属于该部门。
应该清楚的是,这些规则中的前三个在不同的情况下是有用的。对于任何给定的关系,您可以根据业务逻辑选择最合适的关系。没有使用No Action规则的原因就不那么明显了,因为如果你使用它,你就有可能让对象图处于不一致的状态(员工与被删除的部门有关系)。
如果使用“无操作”规则,则需要确保维护对象图的一致性。您有责任将任何反向关系设置为有意义的值。在您有多对多关系并且目的地可能有大量对象的情况下,这可能是有益的。