无法从核心数据中读取数据

时间:2014-09-22 22:22:45

标签: ios objective-c xcode core-data

我有一个用户可以添加对象的数组。我有一个表格视图,列出了用户不想要的“坏”成分。他们可以在数组中添加这些对象,但我不认为我正确地阅读它们。我知道我写的正确,因为我确保我的代码会检查它。

这是我在核心数据中添加对象的方式:

-(void)addRow
{
UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:@"Add a Bad Ingredient" message:@"Type the name of the ingredient" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:@"Cancel", nil];
myAlertView.alertViewStyle = UIAlertViewStylePlainTextInput;
[myAlertView show];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

NSManagedObjectContext *context = [self managedObjectContext];
AllergicIngredient *allergic = [NSEntityDescription insertNewObjectForEntityForName:@"AllergicIngredient" inManagedObjectContext:context];

NSString *enteredString = [[alertView textFieldAtIndex:0] text];

[allergic setValue:enteredString forKey:@"name"];

NSError *error;

if (![context save:&error])
{
    NSLog(@"Couldnt find the save %@", error.localizedDescription);
}

else
{
    NSLog(@"It saved properly");
}


[badIngredientsArray addObject:enteredString];
NSLog(@"%@", badIngredientsArray);
[self.tableView reloadData];
}

这就是我从中读取的方法(确保我的数组从核心数据中获取对象):

-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];

NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"AllergicIngredient"];


badIngredientsArray = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];



[self.tableView reloadData];
}

我正在努力寻找从中读取错误的错误。到目前为止,我没有给出任何错误消息或SIGABRTS,因为当我尝试转到我正在获取数据的特定页面时,应用程序崩溃了。

1 个答案:

答案 0 :(得分:1)

我看到你正在使用带有核心数据的UITableView。 鉴于上下文,为什么不使用NSFetchResultsController?

如果您使用它,您将能够执行以下操作:

#pragma mark - Fetched Results Controller Section
- (NSFetchedResultsController *)fetchedResultsController {

    if (_fetchedResultsController) {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:[MyMO description]
                                              inManagedObjectContext:self.managedObjectContext];

    [fetchRequest setEntity:entity];

    // Specify how the fetched objects should be sorted

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@""
                                                                         ascending:YES
                                                                          selector:@selector(localizedStandardCompare:)];


    [fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];

    [fetchRequest setFetchBatchSize:20];

    NSError *error = nil;
    NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

    if (fetchedObjects == nil) {
        NSLog(@"Error Fetching: %@", error);
    }

    _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                                    managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"masterCache"];

    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;
}

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView beginUpdates];
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView endUpdates];
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {


    UITableView *tableView = self.tableView;

    switch (type) {
        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
        case NSFetchedResultsChangeUpdate: {
            Person *changedPerson = [self.fetchedResultsController objectAtIndexPath:indexPath];
            UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
            cell.textLabel.text = changedPerson.birthName;
        }
            break;
        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
        default:
            break;
    }
}

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id<NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {

    switch (type) {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
        case NSFetchedResultsChangeDelete:
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];

            break;
        default:
            break;
    }

}

和UITableView方法:

- (void)viewDidLoad
{
    [super viewDidLoad];    
    NSError *error = nil;
    if (![self.fetchedResultsController performFetch:&error]) {
        NSLog(@"Error while fetching: %@", error);
        abort();
    }
}

#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return [self.fetchedResultsController.sections count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    id <NSFetchedResultsSectionInfo> sectionInfo = self.fetchedResultsController.sections[section];
    return [sectionInfo numberOfObjects];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    MyMo *mo = [self.fetchedResultsController objectAtIndexPath:indexPath];

    // Configure the cell...

    return cell;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return [self.fetchedResultsController.sections[section]name];
}

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        NSManagedObjectContext *context = self.managedObjectContext;
        MyMo *mo = [self.fetchedResultsController objectAtIndexPath:indexPath];
        [context deleteObject:mo];

        NSError *error = nil;

        if (![context save:&error]) {
            NSLog(@"Error saving: %@", error);
        }
    }
}