NSSortDescriptor для NSFetchRequestController вызывает сбой при изменении значения отсортированного атрибута

StackOverflow https://stackoverflow.com/questions/2230477

Вопрос

У меня есть объект Core Data с рядом атрибутов, которые включают amount (float), categoryTotal (float) и category (string)

Начальный 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 (null) Программа получила сигнал:“EXC_BAD_ACCESS”.

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

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

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

Любые идеи были бы очень кстати

Спасибо, Эй Джей

Это было полезно?

Решение

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top