Ошибка в основных данных / NSFetchedResultsController - PullRequest
5 голосов
/ 08 января 2010

У меня проблемы с основными данными / NSFetchedResultsController. Я не совсем уверен, где ошибка, так как сообщение довольно расплывчато.

У меня проблема со вставкой более одного объекта, когда в выбранном контроллере результатов нет выбранных объектов. Следующий код завершится сбоем со следующей ошибкой, если я попытаюсь вставить несколько объектов, которые еще ни разу не были получены. Он не падает, если я использую его для вставки одного объекта, и не падает, если уже выбраны объекты.

Сбой происходит при сохранении: метод. заголовки в NSArray, и в этом примере он содержит 5 строк.

Серьезная ошибка приложения. исключение был пойман во время изменения основных данных обработка: * - [NSCFArray objectAtIndex:]: index (4) за bounds (1) с userInfo (null) * Завершение работы приложения из-за необработанного исключения «NSRangeException», причина: '*** - [NSCFArray objectAtIndex:]: индекс (4) за пределами (1) '

NSEnumerator *titleEnumerator = [titles objectEnumerator];
NSString *title;
NSMutableArray *tasks = [NSMutableArray array];
Todo *todo;

while(title = [titleEnumerator nextObject])
{
    todo = (Todo *)[NSEntityDescription insertNewObjectForEntityForName:@"Todo" inManagedObjectContext:managedObjectContext];
    todo.title = title;
    todo.state = [NSNumber numberWithInteger:TodoStateIncomplete];
    todo.priority = [NSNumber numberWithInteger:TodoPriorityNormal];
    todo.timeStamp = [NSDate date];
    todo.dueDate = [NSDate distantFuture];
}

NSError *error;

if(![managedObjectContext save:&error])
{
    NSLog(@"Unresolved error %@ %@", error, [error userInfo]);
    abort();
}

Ответы [ 4 ]

5 голосов
/ 08 января 2010

Вот совет Маркуса Зарры (автора книги Core Data):

Ошибка основных данных при удалении строки в tableView

«Попробуйте взломать objc_exception_throw и посмотрите, какой метод вызывает исключение. Это должно помочь отследить его»

4 голосов
/ 11 января 2010

Подобные ошибки при сохранении базовых данных при использовании iPhone SDK обычно указывают на ошибку в методах делегата NSFetchedResultsController. В частности, один из примеров фрагментов кода от Apple является неправильным и часто выдает эту ошибку. Я бы посоветовал взглянуть на методы вашего делегата и сравнить их с последним примером кода, поскольку вы можете обнаружить, что Apple обновила код примера в документации, и если вы повторно скопируете их код, эта ошибка может исчезнуть.

Надеюсь, это поможет.

0 голосов
/ 09 марта 2016

В моем случае эта реализация была полезна (спасибо Петерту):

- (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{
switch (type) {
    case NSFetchedResultsChangeInsert:

        [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
        break;

    case NSFetchedResultsChangeDelete:
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
        break;

    case NSFetchedResultsChangeUpdate: {

        NSString *sectionKeyPath = [controller sectionNameKeyPath];
        if (sectionKeyPath == nil){
             break;
        }

        [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];

        break;
    }
    case NSFetchedResultsChangeMove: {

        if (newIndexPath != nil) {

            NSUInteger tableSectionCount = [self.tableView numberOfSections];
            NSUInteger frcSectionCount = [[controller sections] count];
            if (frcSectionCount > tableSectionCount)
                [self.tableView insertSections:[NSIndexSet indexSetWithIndex:[newIndexPath section]] withRowAnimation:UITableViewRowAnimationNone];
            else if (frcSectionCount < tableSectionCount && tableSectionCount > 1)
                [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:[indexPath section]] withRowAnimation:UITableViewRowAnimationNone];


            [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [self.tableView insertRowsAtIndexPaths: [NSArray arrayWithObject:newIndexPath]
                                  withRowAnimation: UITableViewRowAnimationRight];

        }
        else {
            [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[indexPath section]] withRowAnimation:UITableViewRowAnimationFade];
        }
        break;
    }
}}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id<NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type{
switch (type) {
    case NSFetchedResultsChangeInsert:
        if (!((sectionIndex == 0) && ([self.tableView numberOfSections] == 1)))
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
        break;
    case NSFetchedResultsChangeDelete:
        if (!((sectionIndex == 0) && ([self.tableView numberOfSections] == 1) ))
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];

        break;
    case NSFetchedResultsChangeUpdate:
        break;
    case NSFetchedResultsChangeMove:
        break;
}}
0 голосов
/ 08 января 2010

Я знаю, что это вряд ли будет ответом, но так как сбой происходит при сохранении: и я помню, что однажды у меня была странная ошибка с этим ... Ошибка, которую я исправил таким образом, я думаю, стоит попробовать .

Итак, с учетом сказанного, попробуйте изменить

NSError *error;

до

NSError *error = nil;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...