3

我正在尝试使用 Core Data 编写应用程序,并且我已经能够成功地读取和写入核心数据数据库。但是,如果我在一个视图控制器中写入数据库,我的其他视图控制器将不会看到更改,直到应用程序关闭然后再次重新打开。这真是令人沮丧。我不完全确定如何使刷新- (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag方法起作用。如何获得对我的托管对象的引用?

无论如何,这是我用来读回数据的代码。这是在 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

根据我的理解,我不完全确定您打算做什么,您正在一个视图控制器中更改托管对象上下文,并且您希望结果在其他视图控制器中可见,这是正确的吗?无论如何,对此的解决方案是侦听 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 回答