問題を報告したすべての投稿を参照しましたmanagedObjectContext save:
しかし、私が見ている問題を解決するようなものは見つかりませんでした。ほとんどの場合、FRCとtableViewを調整する問題があります。これは違う。NSManagedObjectContextの保存メソッドが例外をスローする
NSManagedObjectContextインスタンスでsaveを呼び出すと、この問題が発生します。キャッチして例外を記録すると、「非コレクションオブジェクトでコレクションの評価を実行できません」というメッセージが表示されます。誰かがそれが何を意味するのかという手がかりを持っていますか?
@try {
if ([self.managedObjectContext hasChanges]) {
@synchronized(managedObjectContext) {
if(![managedObjectContext save:&error]) {
NSLog(@"\n\n---------UNRESOLVED ERROR--------------\n\n UserInfo: \n%@, %@", error, [error userInfo]);
[self.managedObjectContext rollback];
}
}
}
}
@catch (NSException *exception) {
NSLog(@"\n\n---------UNRESOLVED ERROR--------------\n\n exception: \n%@\n%@", exception, error);
}
唯一の手掛かりはこの問題の再現性です。これは、私が保持しているfetchedResultsControllerアクセサを除外した後に発生し、述語のセットで新しいインスタンスをインスタンス化した後に発生します。
if(searchFetchedResultsController) {
self.searchFetchedResultsController = nil;
}
self.searchFetchedResultsController = [predicateBuilder createSearchInContext:managedObjectContext forDelegate:self withSortDescriptors:self.sortDescriptors forEntityName:@"Record"];
NSError *error = nil;
[self.searchFetchedResultsController performFetch:&error];
if(error)
NSLog(@"\nfetch error: %@", error);
私は、後に、通常のアクセサ建設を使用していない述語で新しいNSFetchedResultsControllerを維持するだろう。
if(fetchedResultsController) {
self.fetchedResultsController = nil;
}
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
次に、レコードmanagedObjectを追加します。セーブ;保存して例外をスローします。
これはいつも、私の述語が数字や日付を照会している場合にのみ発生します。文字列を照会するときにでなく、が発生します。だから、私はクエリの構築が唯一の違いだと思った。問題は、フェッチが失敗しないため、どちらも有効な述部を(SUBQUERYを介して)作成していることです。だから違いがあるなら、それが何であるか教えてもらえませんでした。
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];
注皆無cacheNameを指定し、sectionNameKeyPath
私は私の前提を明確にするために2つのポインタを使用しています:注目に値する
他のものは、それはこのようになりますI「のalloc」FRCすべての場所ですFRCと非述語のFRC。私はそれが言及しなければ誰かに迷惑をかけてしまうことを知っている。
-(void) setSearchFilteredNames:(BOOL)boolValue {
searchFilteredNames = boolValue;
if(boolValue) {
self.searchFetchedResultsController.delegate = self;
self.fetchedResultsController.delegate = nil;
//self.fetchedResultsController = nil; //lazy regeneration
} else {
self.searchFetchedResultsController.delegate = nil;
//self.searchFetchedResultsController = nil; //lazy regeneration
self.fetchedResultsController.delegate = self;
}
}
また、例外をキャッチすると、新しいオブジェクトが保持されます。
あなたの答えは本当にありがとう、それは私を大いに助けました。検索が最初に実行された理由と信じられないほど混乱していましたが、追加/削除時にクラッシュしました。 YOU DA MAN –
@Josh O'Connor喜んで助けてください。私はCoreDataがこれらのトレンチを掘り下げて以来、もっと良くなったことを願っています。あなたのコメントはあまり示唆していません。後で、私はSQLiteを真っ直ぐ行っていたはずです...私はそこに私の舌を噛むでしょう。 – stephen