at_yasu's blog

ロード的なことを

Fault cannot be fulfilled

今イチ理解してないけど。

「NSObjectInaccessibleException Fault cannot be fulfilled 〜」とエラーが出されて何のこっちゃと思ってたら、どうも、NSManagedObject を作成中にクラッシュなどして、commitされずに放置されたエンティティにアクセスした時に怒るみたい。

例えば関連エンティティ作成中にabortした時、次からその関連エンティティにアクセスしても、上記のようなエラーが出ます。

んじゃどうすっぺという訳で、つまりは中途半端に作成した NSManagedObject を破棄してやればいいだけの話。


ManageObjectA のエンティティ

  • relateA: Relation for A. Many to one.

RelateA のエンティティ

  • f: NSString
  • MOA: Relation for ManageObjectA. one To Many.

ManageObjectA と A は多対一。

// ManageObjectA のカテゴリークラス
// self.relateA にアクセス
- (RelateA) relationA
{
  if ([self hasFaultForRelationshipNamed:@"relateA"])
  {
    // ヌッコ割れてたので、nilを返す。
    return nil;
  }
  return self.relateA;
}


上には書いてませんが、壊れている RelateA は削除するようにしてやって下さい。
もし RelateA だけを NSFetchRequest で取ってくる場合、中には壊れた子が混じっている事になります。その場合は下のような確認コードが必要になりますよっと。

// NSFetchRequest で取得
NSArray* arr = [self.managedObjectContext executeFetchRequest:request
                                                                error:&err];
for (RelateA* a in arr)
{
    if ([a isFault])
    {
        [self.managedObjectContext deleteObject:a];
    }
}

// 再度取得?