0

コア データ アプリが与えられます。関係が空でない場合、削除を防止したいと思います。

最良の方法は、と思われます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;
 }

セットは間違いなく空ではありません。NSArrayControllers が適切に構成されていない可能性があります..!

4

1 に答える 1

0

たくさん掘り下げた後、validateForDeleteもprepareDeleteも(自分で)削除を防ぐことを意図していません。

基本的に必要なのは、NSSet の関係のサイズまたは数をチェックすることです。

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

iPhone Core Data の 1対多の関係で Cascade Delete Rule と validateForDelete を使用する

これが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 に答える