2013-04-25 36 views
0

給定一個核心數據應用程序。如果關係不爲空,我想阻止刪除。nsmanagedobject relationship 0

最好的方法似乎是validateForDelete。然而,quering關係的大小,當它返回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沒有正確配置..!

+0

Urgh。現在它返回適當的計數 - 如果關係設置爲「拒絕」。但設置爲'級聯',計數爲0.現在,第二個問題:實體被刪除。或者至少,從Controller中刪除,或者標記爲刪除。 – 2013-04-25 23:11:00

回答

0

經過一堆的挖掘後,validateForDelete或prepareDelete都無法防止刪除(自我)。

基本上所需要的是檢查關係的大小或計數,即NSSet的關係。

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

Using Cascade Delete Rule and validateForDelete on a One-to-Many Relationship in iPhone Core Data (假設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]; 
} 
+0

另請注意,這是一級檢查,不是遞歸的。 – 2013-04-26 00:35:01