3

Core Dataを使用してアプリケーションを作成しようとしていますが、コアデータデータベースの読み取りと書き込みに成功しました。ただし、1つのView Controllerでデータベースに書き込むと、アプリを閉じてから再度開くまで、他のViewControllerは変更を確認できません。これは本当にイライラします。- (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flagrefreshメソッドを機能させる方法が完全にはわかりません。管理対象オブジェクトへの参照を取得するにはどうすればよいですか?

とにかく、これが私がデータを読み戻すために使用しているコードです。これはviewDidLoadメソッドにあります。

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Website" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"siteName" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptor release];
[sortDescriptors release];

NSError *error = nil;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if(mutableFetchResults == nil) {
    //Handle the error
}

[self setNewsTitlesArray:mutableFetchResults];
[mutableFetchResults release];
[request release];

[newsSourcesTableView reloadData];

よろしくお願いします!

4

2 に答える 2

3

1つのViewControllerで管理対象オブジェクトのコンテキストを変更していて、その結果を他のView Controllerで表示したいということから、何をするつもりなのか完全にはわかりません。これは正しいですか。とにかく、これに対する解決策は、NSManagedObjectContextDidSaveNotification(コンテキストが保存されたときに送信される)をリッスンし、変更の影響を受けるビューコントローラーをオブザーバーとして登録することです。

NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];
[dnc addObserver:myController selector:@selector(updateTable:) name:NSManagedObjectContextDidSaveNotification object:controller.context];

myControllerコントローラーのupdateTableセレクターは、次のようになります。

- (void)updateTable:(NSNotification *)saveNotification
{
if (fetchedResultsController == nil)
{
    NSError *error;
    if (![[self fetchedResultsController] performFetch:&error]) {
    //Update to handle the error appropriately.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }       
}
else
{
    NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
    // Merging changes causes the fetched results controller to update its results
    [context mergeChangesFromContextDidSaveNotification:saveNotification];  
    [self.tableView reloadData];
}

お役に立てば幸いです。

-オスカー

于 2010-01-29T18:21:19.997 に答える
-1

実際、私が見つけたのは、テーブルをビューとしてロードするように設定していることでした。テーブルを別のビューに配置すると、すべてが正常に機能しました。

于 2010-04-24T22:47:41.040 に答える