0

给定一个核心数据应用程序。如果关系不为空,我想防止删除。

最好的方法似乎是使用validateForDelete. 然而,当查询关系的大小时,它返回 0。

以下集合都返回一个非零对象,但计数为 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;
 }

该集合肯定不是空的。也许 NSArrayControllers 没有正确配置..!

4

1 回答 1

0

经过一堆挖掘之后, validateForDelete 或 prepareDelete 都不是为了防止Delete(对自己)。

本质上,需要检查关系的大小或计数,即 NSSet 的关系。

http://www.cocoabuilder.com/archive/cocoa/232242-nsmanagedobject-validatefordelete-problem.html

在 iPhone Core Data 中的一对多关系上使用级联删除规则和 validateForDelete (在这种情况下,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];
}
于 2013-04-26T00:28:20.217 回答