Core data nsmanagedobject关系0
给出了一个核心数据应用程序。如果关系不是空的,我希望防止删除 最好的方法似乎是使用Core data nsmanagedobject关系0,core-data,nsmutablearray,nsmanagedobject,Core Data,Nsmutablearray,Nsmanagedobject,给出了一个核心数据应用程序。如果关系不是空的,我希望防止删除 最好的方法似乎是使用validateForDelete。然而,当查询关系的大小时,它返回0 以下集合都返回非nil对象,但计数为0 - (BOOL)validateForDelete:(NSError **)error { NSSet *emp0 = [self employees]; NSSet *emp1 = [self valueForKey:@"employees"]; NSMutableSet
validateForDelete
。然而,当查询关系的大小时,它返回0
以下集合都返回非nil对象,但计数为0
- (BOOL)validateForDelete:(NSError **)error {
NSSet *emp0 = [self employees];
NSSet *emp1 = [self valueForKey:@"employees"];
NSMutableSet *emp2 = [self mutableSetValueForKey:@"employees"];
...
if ([emp0 count] <= 0) return YES:
else return NO;
}
-(BOOL)validateForderDelete:(n错误**)错误{
NSSet*emp0=[自雇员工];
NSSet*emp1=[自我价值观:员工];
NSMutableSet*emp2=[self-mutableSetValueForKey:@“employees”];
...
如果([emp0 count]在一系列挖掘之后,validateForDelete或prepareDelete都不是为了防止删除(在self上)
本质上,需要检查关系的大小或计数,即NSSet的大小或计数
(由于NSCascade将根据本例的需要删除所拥有的对象,因此用途有限)
这是我在ArrayController上的解决方案
@implementation NSArrayController (PreventDeleteController)
- (BOOL)canRemove {
NSArray *selected = [self selectedObjects];
NSEnumerator *objEnum = [selected objectEnumerator];
while ((NSManagedObject *obj = [objEnum nextObject]))
{
NSDictionary *relationships = [[obj entity] relationshipsByName];
for(NSString *key in [relationships allKeys]) {
id relationship = [relationships objectForKey: key];
if([relationship deleteRule] == NSDenyDeleteRule ) {
if ([[obj mutableSetValueForKey:key] count]) {
//CHECK THE COUNT OF THE RELATIONSHIP HERE
return NO;
}
}
}
}
return [super canRemove];
}
Urgh.现在它返回正确的计数——如果关系设置为“Deny”。但设置为“Cascade”,则计数为0。现在,第二个问题:实体被删除。或者至少,从控制器中删除,或者标记为删除。还要注意,这是一个一级检查,而不是递归检查。