2

MagicalRecordで奇妙な問題が発生しています。削除は保持されません。削除すると、NSFetchedResultsControllerDelegateはオブジェクトが削除されたことを正しく認識します。ただし、アプリを閉じて再度開くと、エンティティが再表示されます。

エンティティを削除するために使用しているコードは次のとおりです。

ActivityType *activityType = [_fetchedResultsController objectAtIndexPath:indexPath];
[activityType deleteInContext:[NSManagedObjectContext MR_defaultContext]];
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];

NSFetchedResultsControllerの設定に使用しているコードは次のとおりです。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"ActivityType" inManagedObjectContext:[NSManagedObjectContext defaultContext]];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                          initWithKey:@"name" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:[NSManagedObjectContext defaultContext] sectionNameKeyPath:nil
                                               cacheName:@"activityTypes"];
_fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;

他のSOの投稿に基づいて[NSManagedObjectContext rootSavingContext]、セットアップと削除の両方で使用しようとしました(ただし、役に立ちませんでした)。

4

1 に答える 1

6

私は地獄を通り抜け、コアデータに戻ってきましたが、いくつかのことを学びました。私は疲れているので、簡単な要約を書きます。

  1. エンティティを削除すると、削除ルールのためにコアデータがエンティティを拒否する場合があります。削除が行われなかった理由は、カスケードする必要があったのに無効にしたためです。どういうわけか、実体を放棄したままにしておくことと関係があると思います。なぜそれが削除を妨げる原因になるのかはわかりませんが、私の場合はそれで修正されました。私がそれを発見した方法はログを通してでした、私は参照された依存エンティティについてのいくつかのステートメントを見ました、そして私は削除規則が適用されることに気づきました。

  2. ログに重大なエラーとリスナーに関する情報が記載されている場合は、FRCコードを確認してください。これはリスナーなので、犯人のコードはここのどこかにあります。私の場合、[tableviewbeginUpdates]と[tableviewendupdates]を無効にしました。FRCは実際にこれを必要としています(私はそれがオプションだと思いました)。そうしないと、不整合やmanagedobjectcontextlistener、行の追加または削除の必要性などに関するエラーが発生します。

  3. 削除すると、実際にはメモリローカルコンテキストに保存される場合がありますが、永続ストアには保存されない場合があります。これは、FRCデリゲートコードは変更を認識しますが、保存されない可能性があることを意味します。また、メモリストアは、私のパスであるため、削除ルールのチェックを実行しない場合があります。ただし、永続ストアがチェックを行います。これをもっと調べなければならない。

于 2013-02-22T08:20:00.380 に答える