NSSortDescriptor для NSFetchRequestController вызывает сбой при изменении значения отсортированного атрибута - PullRequest
0 голосов
/ 09 февраля 2010

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

Исходный ViewController использует FethchedResultsController для извлечения сущностей и сортирует их по категории, а затем по категории CategoryTotal. Пока проблем нет.

NSManagedObjectContext *moc = [self managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:moc];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entityDescription];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(dateStamp >= %@) AND (dateStamp =< %@)", startDate, endDate];
[request setPredicate:predicate];

NSSortDescriptor *sortByCategory = [[NSSortDescriptor alloc] initWithKey:@"category" ascending:sortOrder];
NSSortDescriptor *sortByTotals = [[NSSortDescriptor alloc] initWithKey:@"categoryTotal" ascending:sortOrder];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByTotals, sortByCategory, nil];
[request setSortDescriptors:sortDescriptors];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:@"category" cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

При выборе строки (tableView: didSelectRowAtIndexPath) загружается другой контроллер представления, который позволяет редактировать поле суммы для выбранного объекта.

Прежде чем вернуться к первому виду, categoryTotal обновляется на новую «сумму». Проблема возникает при возврате к первому контроллеру представления, приложение бомбит с

Серьезная ошибка приложения. Исключительная ситуация при обработке изменения базовых данных: Неверное обновление: недопустимое количество строк в разделе 0. Число строк, содержащихся в существующем разделе после обновления (1), должно быть равно числу строк, содержащихся в этом разделе до обновления. (1), плюс или минус количество строк, вставленных или удаленных из этого раздела (0 вставлено, 1 удалено). с userInfo (ноль) Программа получила сигнал: «EXC_BAD_ACCESS».

Это, похоже, любезно предоставлено NSSortDescriptor * sortByTotals = [[NSSortDescriptor alloc] initWithKey: @ "categoryTotal" ascending: sortOrder]; Если я удаляю это, все работает как положено, но, очевидно, без сортировки, которую я хочу.

Я предполагаю, что это связано с изменением порядка сортировки из-за изменения категории (удаление / вставка), но не могу найти, как это исправить. Я проверил, что значения корректно изменяются во втором представлении, так что это выглядит вплоть до путаницы fetchedResultsController. Если значение categoryAmount изменено на значение, не меняющее порядок сортировки, ошибка не генерируется

Я физически не изменяю (т.е. удаляю) количество элементов, возвращаемых fetchedResultsController ... единственная другая проблема, которую я могу найти, которая, кажется, вызывает эту ошибку

Любые идеи будут приветствоваться

Спасибо, AJ

Ответы [ 3 ]

3 голосов
/ 27 марта 2010

Порядок ваших управляемых объектов через sectionNameKeyPath ДОЛЖЕН совпадать с порядком ваших управляемых объектов через ваш основной дескриптор сортировки. Поскольку вы используете "category" в качестве вашего sectionNameKeyPath и при этом используете "categoryTotal" в качестве основного дескриптора сортировки, не всегда будет верно, что sectionNameKeyPaths имеет тот же порядок, что и основной дескриптор сортировки. Причина, по которой удаление sortByTotals решает проблему, заключается в том, что «категория» становится как sectionNameKeyPath, так и основным дескриптором сортировки, и, таким образом, они оба имеют одинаковый порядок.

2 голосов
/ 27 марта 2010

Попробуйте изменить сортировку в вашем NSFetchedResultsController, чтобы сначала отсортировать по категории, а затем по категории. Это должно решить проблему. Если это не так, пожалуйста, опубликуйте свои NSFetchedResultsController методы делегирования.

0 голосов
/ 09 февраля 2010

Если categoryTotal - временное свойство, вы не можете отсортировать по этому свойству с помощью запроса на выборку. Вам нужно будет отсортировать fetchedObjects вручную (по коду) во второй массив, который вы можете использовать в таблице.

...