2016-06-01 6 views
0
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { 
     RPCoreData *manager = [RPCoreData sharedManager]; 
     if (manager.IdsArray) { 
      NSPredicate *itemFilter = [NSPredicate 
       predicateWithFormat:@"NOT (id IN %@)", manager.IdsArray]; 
      NSArray *itemArray = [ItemData MR_findAllWithPredicate:itemFilter]; 
      for (ItemData *itemData in itemArray) { 
       NSPredicate *categoryFilter = 
        [NSPredicate predicateWithFormat:@"id == %@", itemData.category.id]; 
       CategoryData *categoryDataInLocalContext = 
        [CategoryData MR_findFirstWithPredicate:categoryFilter inContext:localContext]; 
       if (![categoryDataInLocalContext isKindOfClass:[NSNull class]]) { 
        [categoryDataInLocalContext removeRelationshipObject:itemData]; 
       } 
      } 
     } 

    } 
     completion:^(BOOL success, NSError *error) { 
      NSLog(@"%i %@", success, error); 
     }]; 

NSlogが出力します。CoreDataはアイテム間の関係を削除していません

CategoryDataとItemDataの関係は削除されていません。 カテゴリーは単に

for (ItemData *itemData in itemArray) { 
    itemData.categoryData = nil 
} 

CategoryDataをフェッチする必要はありませんを設定することによりにItemData

+0

あなたは 'manager.IdsArray'に実際に何かが含まれていることを確認しましたか?デバッグし、すべての変数を見て、あなたが期待していないものを見つけてください。あなたはすでに関係を持っているのでカテゴリをフェッチする必要はありません... – Wain

+0

あなたは間違ったコンテキストにアクセスしているので、このコードで '[ItemData MR_findAllWithPredicate:itemFilter]'を実行すべきではありません。( IIRCこれは主なコンテキストを使用しています) – Wain

+0

@Wain感謝します。私はいつもどこかでローカルな文脈を忘れています。 – user1898829

答えて

0

あなたが関係を削除することができるはずとの一対多の関係を持っています。リレーションシップをitemData側から削除すると、それはCategoryData側からも削除されます。

Delete ruleがデータモデルのNullifyに設定されていることを確認してください。また、正しいコンテキストにいることを確認してください。

関連する問題