Я могу создавать новые управляемые объекты внутри своего приложения, в отдельном представлении у меня есть табличное представление, которое показывает все имеющиеся у меня объекты.
Когда я создаю новый управляемый объект (в совершенно отдельном представлении)Я отправляю уведомление, которое пытается заставить мою таблицу перезагружаться с новыми данными, которые включают в себя новый объект, который я только что сделал.
Я не редактирую табличное представление.
Существует только один управляемый контекст.
Я не могу понять, что я делаю неправильно.Если я закрою приложение и перезапущу мой новый объект в представлении таблицы.Я пытаюсь вызвать 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;
}
ОБНОВЛЕНИЕ
Я вернулся к простому запросу всех объектов, потому что яМне пришлось быстро решить мою проблему, и затем я понял, что после сохранения контекста мой запрос на выборку, который я ранее использовал при запуске приложения, теперь не возвращает данных, ошибок нет, но просто ничего не возвращается.
Так что я думаю, что нет никаких проблем с тем, как я реализую 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;
}
}
Я жду уведомления, сообщающего мненовый объект был добавлен в Core Data, а затем я вызываю вышеуказанный метод, а затем вызываю reloadData для моего табличного представления ...