4

- (NSFetchedResultsController *)fetchedResultsControllerCoreDataBook の例から始めて、標準的な方法で内部に述語があります。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"state=%@ && date >= %@ && date < %@", @"1",fromDate,toDate];
    [fetchRequest setPredicate:predicate];

これは正常に機能しますが、アイテムを編集すると、Update ではなく NSFetchedResultsChangeDelete が返されます。メイン ビューが戻ると、項目がありません。シミュレーターを再起動すると、削除が保存されず、述語が正しく機能している正しい編集結果が表示されます。

case NSFetchedResultsChangeDelete:
 [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
 break;

2 つの述語行のみをコメントアウトすることで動作を確認できます。NSFetchedResultsChangeDelete の代わりに NSFetchedResultsChangeUpdate を編集して呼び出した後、完全なセットで正しく返されるはずです。

同様の動作を報告しているhttp://matteocaldari.it/2009/11/multiple-contexts-controllers-delegates-and-coredata-bugを読み ましたが、問題の回避策は見つかりませんでした。

4

4 に答える 4

1

申し訳ありませんが、しばらく時間がかかりました。まもなく製品をリリースします。回避策は、フェッチされたオブジェクトでストアド プロシージャを作成し、

NSFetchRequest *fetch = [model fetchRequestFromTemplateWithName:@"myTemplate1" substitutionVariables:subs];

これにより、FetchedResultsController で Predicate を使用する必要がなくなります。

述語を使用したい場合は、ローカルの managedObjectContext を使用していることを確認し、配列自体を渡して他の場所で作業します。 NSArray *array = [moc executeFetchRequest:fetchRequest error:&error]; return array;

これはより安全な賭けであり、同じデータの多くのビューを作成できます.

于 2010-05-10T11:04:00.093 に答える
0

私の投稿では、既知のバグNSFetchedResultsController( https://devforums.apple.com/message/139580#139580を参照) を扱っています。これは、2 つの異なる管理対象オブジェクト コンテキストで 2 つのオブジェクト間のポインター比較を行い、代わりに を評価objectIDするので、これはあなたの問題ではないと思います。

dateで指定された間隔外でオブジェクトを変更した場合、NSPredicateまたはその他の変更についても、オブジェクトは削除されたものとして扱われますか?

于 2010-05-10T08:58:25.923 に答える
0

複数使用していますNSManagedObjectContextか?あなたがリンクした投稿NSManagedObjectContextは、彼の問題の根源である複数のインスタンスを不適切に使用していました. これは のバグではなく、NSFetchedResultsControllerその仕組みに関する彼の誤解です。

あなたの問題に関して; 最初の質問: あなたが示したものの前に休憩がありcaseますか?

編集コードはどのように見えますか? 述語を表示しますが、あなたが述べたオブジェクトを編集しているコードは表示されませんNSFetchedResultsChangeDelete

于 2010-05-10T05:09:49.747 に答える