我可以在我的应用程序中创建新的托管对象,在一个单独的视图中我有一个表视图,显示了我拥有的所有对象。刷新NSFetchedResultsController数据?
当我创建一个新的托管对象(在一个完全独立的视图中)时,我发出一个通知,试图让我的表视图重新载入包含我刚刚创建的新对象的新数据。
我没有编辑表格视图。
只有一个托管上下文。
我不明白我做错了什么。如果我关闭了应用程序并重新启动我的新对象在表格视图中。我试图在获取新对象的通知时调用reloadData,并且我也尝试再次执行提取操作,但是最后我得到的是一个空表视图。
在代码方面,我ListViewController:
@interface MyNotesViewController : UIViewController
{
NSManagedObjectContext * __managedObjectContext;
UITableView * _notesTableView;
MyNotesTableViewDelegate_DataSource * _tableDelegate_DataSource;
}
我viewDidLoad中看起来是这样的:
- (void)viewDidLoad
{
[super viewDidLoad];
_tableDelegate_DataSource = [[MyNotesTableViewDelegate_DataSource alloc] init];
_tableDelegate_DataSource.managedObjectContext = __managedObjectContext;
[_notesTableView setDataSource:_tableDelegate_DataSource];
NSError * _coreDataError;
BOOL success = [[_tableDelegate_DataSource fetchedResultsController] performFetch:&_coreDataError];
if(success){
[_notesTableView reloadData];
}
}
在我的委托/数据源对象,我有:
@interface MyCommutesTableViewDelegate_DataSource : NSObject
<UITableViewDataSource, NSFetchedResultsControllerDelegate>
{
NSManagedObjectContext * __managedObjectContext;
NSFetchedResultsController * __fetchedResultsController;
}
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@end
实现摘录:
-(NSFetchedResultsController*)fetchedResultsController{
if(!__fetchedResultsController){
NSFetchRequest * request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Note" inManagedObjectContext:__managedObjectContext]];
[request setFetchBatchSize:10];
NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"noteDate" ascending:NO];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
__fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:__managedObjectContext sectionNameKeyPath:nil cacheName:nil];
__fetchedResultsController.delegate = self;
[request release];
}
return __fetchedResultsController;
}
我有机架的UITableView数据源的方法在这里:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
id <NSFetchedResultsSectionInfo> sectionInfo =
[[__fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"NotesTableViewCell";
NotesTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
NSArray * topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"NotesTableViewCell" owner:nil options:nil];
for(id currentObject in topLevelObjects){
if([currentObject isKindOfClass:[UITableViewCell class]]){
cell = (NotesTableViewCell*) currentObject;
break;
}
}
}
// Configure the cell.
Note * _note = [__fetchedResultsController objectAtIndexPath:indexPath];
[...]
return cell;
}
UPDATE
我恢复了简单,要求所有的对象,因为我必须快速解决我的问题,然后我意识到,后我保存了我的上下文,我以前在应用程序启动时使用的提取请求现在不返回任何数据,也没有错误,但它不会返回任何内容。
所以我想我没有如何实现NSFetchResultsController的问题。但是,在保存一个新对象后,请求怎么会开始不返回结果呢?
注意如果我重新启动,包括新添加的对象,我仍然可以获得所有对象。
标准要求:
-(NSArray*)getNotes{
NSFetchRequest * request = [[NSFetchRequest alloc] init];
NSEntityDescription * entity = [NSEntityDescription entityForName:@"Note" inManagedObjectContext:[self managedObjectContext]];
[request setEntity:entity];
NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"noteDate" ascending:NO];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
NSError * coreDataError;
NSArray * fetchedObjects = [[self managedObjectContext] executeFetchRequest:request error:&coreDataError];
[request release];
if(fetchedObjects != nil){
return fetchedObjects;
} else {
NSLog(@"ERR: %@", coreDataError);
return nil;
}
}
我在等待一个通知,告诉我已经被添加到核心数据一个新的对象,然后我打电话上面的方法,然后在我的tableview调用reloadData ...
当然,你要重新加载_notesTableView在您的案件。 – huesforalice
另外不要忘记'NSFetchedResultsController'只会响应''save:'在'NSManagedObjectContext'上被调用。因此,如果您不保存新创建的实体,则可能看不到此方法。 –
谢谢,我正在实施controllerDidChangeContent:从NSFetchedResultsControllerDelegate协议,调用我tableview上的reloadData。我添加了断点并调用了此方法,但tableview正在重新加载空。如果我重新启动应用程序,我可以看到所有记录,包括新的记录。我错过了什么? PS:我必须实现控制器:didChangeObject:atIndexPath:forChangeType:newIndexPath? – Daniel