同様のスレッドで多くの回答を見てきましたが、彼らの推奨事項に従った後も、まだ奇妙な問題があり、頭を壁にぶつけています。
人のテーブルがあり、ユーザーがフォームに記入して別のユーザーのエントリを追加するオプションがあります。そのコンストラクターを次に示します。
-(id)initWithContext:(NSManagedObjectContext *)context {
self = [super initWithNibName:@"FamilyMemberInfoViewController" bundle:[NSBundle mainBundle]];
if (self) {
self.managedObjectContext = context;
mainUser = [NSEntityDescription insertNewObjectForEntityForName:@"FamilyMember" inManagedObjectContext:context];
Details *userDetails = [NSEntityDescription insertNewObjectForEntityForName:@"Details" inManagedObjectContext:context];
mainUser.details = userDetails;
userDetails.familyMember = mainUser;
...等。
そして、ユーザーが戻るボタンをクリックすると、次のように呼び出します。
-(void) viewWillDisappear:(BOOL)animated {
if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) {
...
[self.managedObjectContext rollback];
[mainUser release];
self.managedObjectContext = nil;
...
親テーブル ビュー コントローラーに移動すると、以下のコードでデータがリロードされ、予想どおり、オブジェクトはなくなります。
-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
if (viewController == self) {
NSFetchRequest *familyMemberRequest = [NSFetchRequest new];
NSEntityDescription *familyDescription = [NSEntityDescription entityForName:@"FamilyMember" inManagedObjectContext:self.managedObjectContext];
familyMemberRequest.entity = familyDescription;
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"isMainUser == 0"];
[familyMemberRequest setPredicate:predicate];
NSError *error;
self.familyMembers = [managedObjectContext executeFetchRequest:familyMemberRequest error:&error];
NSLog(@"Retrieved family members! Count = %i", self.familyMembers.count);
[familyMemberRequest release];
}
}
ただし、タブから離れてクリックしてtableView
戻ると、同じコードが再度実行され、管理オブジェクトコンテキストでキャンセルされたオブジェクトが見つかります。
しかし、アプリを再実行すると、どこにも見つかりません。
別の新しい人物を作成してバックアウトしようとすると、最初は正しい数のエントリが表示され (キャンセルされたオブジェクトはありません)、別のタブをクリックして戻ると、最近キャンセルされたオブジェクトだけが表示されます。そこにあるべきもの。
FamilyMemberInfoViewController
: [context reset]
、[context rollback]
、などのマネージド オブジェクト コンテキストをクリアするあらゆる方法を試しました。実験的に配列を 2 回読み込んでみましたが[context deleteObject:]
、[戻る] ボタンをクリックしても正しい数のオブジェクトが見つかりますが、別のタブをクリックしてから戻ると、余分なオブジェクトが表示されます(そこに行って戻っても引き続き表示されます)。[context processPendingChanges]
familyMembers
何か案は?