対多関係で示される、新しく挿入された CalendarEntry オブジェクトでのみ問題が発生する場合は、永続的なオブジェクト ID がまだない可能性があります。これは、オブジェクト ID をダンプし、それが一時的か永続的かを確認するだけで簡単にデバッグできます。
対多関係の包含オブジェクトが保持されている場合に、これが発生するのを見てきました。それが保持されている限り、関係に含まれる対多のオブジェクトは、永続的な ID を取得するようになることはないようです。アプリケーションをバックグラウンドに置いて再起動することで、デバッグがやや簡単になります。通常、バックグラウンド処理により UIManagedDocument が強制的に保存され、CalendarEntry エンティティに永続的な ID が割り当てられてフェッチ可能になるため、その後は期待どおりに機能し始めます。
UIManagedDocument を保存する限り、UIManagedDocument を使用するときにそれがいつ発生するかを制御することはできません。最善の方法は、updateChangeCount:UIDocumentChangeDone を使用して、保存が将来発生するようにスケジュールすることですが、これも「すぐに」発生しますが、決定論的ではありません。つまり、いつ発生するかを知ることはできません。
一時的なオブジェクト ID と永続的なオブジェクト ID の問題を解決するには、それが表示されている場合は、NSManagedObjectContext で次のカテゴリを試してください。問題を強制するために、新しい CalendarEntry オブジェクトの挿入が完了した後に呼び出します。
// Obtain permanent ids for any objects that have been inserted into
// this context.
//
// As of this writing (iOS 5.1), we need to manually obtain permanent
// ids for any inserted objects prior to a save being performed, or any
// objects that are currently retained, that have relationships to the
// inserted objects, won't be updated with permanent ids for the related
// objects when a save is performed unless the retained object is refetched.
// For many objects, that will never occur, so we need to force the issue.
- (BOOL)obtainPermanentIDsForInsertedObjects:(NSError **)error
{
NSSet * inserts = [self insertedObjects];
if ([inserts count] == 0) return YES;
return [self obtainPermanentIDsForObjects:[inserts allObjects]
error:error];
}