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。现在,第二个问题:实体被删除。或者至少,从控制器中删除,或者标记为删除。还要注意,这是一个一级检查,而不是递归检查。