0

メイン テーブル ビュー コントローラーで NSFetchedResultsController を使用する iPhone アプリを開発しています。メイン テーブル ビュー コントローラーの viewDidload で次のように作成します。

NSSortDescriptor *sortDescriptorDate = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
 NSSortDescriptor *sortDescriptorTime = [[NSSortDescriptor alloc] initWithKey:@"start" ascending:YES];
 NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptorDate,sortDescriptorTime, nil];
 [fetchRequest setSortDescriptors:sortDescriptors];
 [sortDescriptorDate release];
 [sortDescriptorTime release];
 [sortDescriptors release]; 




 controller = [[NSFetchedResultsController alloc]
      initWithFetchRequest:fetchRequest
      managedObjectContext:context
      sectionNameKeyPath:@"date"
      cacheName:nil];
 [fetchRequest release];

 NSError *error;
 BOOL success = [controller performFetch:&error];

次に、後続のビューで、コンテキストに新しいオブジェクトを作成します。

  TestObject *testObject = [NSEntityDescription insertNewObjectForEntityForName:@"TestObject" inManagedObjectContext:context];

TestObject にはいくつかの関連オブジェクトがあり、これらを同じ方法で作成し、提供された add...Objects メソッドを使用して testObject に追加します。

次に、コンテキストを保存する前にキャンセルを押してメイン テーブル ビューに戻ると、期待どおりに何も表示されません。ただし、アプリを再起動すると、コンテキストで作成したオブジェクトがメイン テーブル ビューに表示されます。どうして?最初は、NSFetchedResultsController がキャッシュから読み取っていたためだと思いましたが、ご覧のとおり、テストのためにこれを nil に設定しました。また、[context hasChanges] は、再起動後に true を返します。ここで何が欠けていますか?

4

3 に答える 3

1

コンテキストが自動的に保存されることはありません。保存が表示されている場合は、-save:どこかに呼び出しがあります。QED

物事がディスクに書き込まれていることを確認するには、sqlite ファイル自体を見ていますか? そこをのぞいて、何が書かれているのかを確認できます。そこに何もない場合は、起動時にデフォルトのオブジェクトまたは何かを生成している可能性があります。

于 2010-06-12T20:59:28.793 に答える
0

あなたのキャンセルボタンは実際には何もキャンセルしていないように思えます(つまり、実行されていないundorollback、シャギーフロッグが述べているように.

保存されるコンテキストについては、「Use Core Data for storage」チェックボックスをオンにして Xcode プロジェクトを作成することから始めましたか? その場合、生成されたテンプレートには、アプリケーションの終了時に保存されるコンテキストが含まれます。

- (void)applicationWillTerminate:(UIApplication *)applicationAppDelegate にチェックインします。

于 2010-07-30T10:13:40.213 に答える
-1

アプリNSManagedObjectContextを再起動したときにオブジェクトが表示される場合、インスタンスは保存されています。

キャンセル ボタン ハンドラーはundoまたはを実行する必要がありrollbackます。

于 2010-06-06T20:59:44.603 に答える