дескриптор сортировки не работает в NSFetchedResultsController

я работаю над основным приложением данных, которое использует NSFetchedResultsController. я сортирую результаты по строке fname. я добавил дескриптор сортировки, но результаты не были отсортированы, и при выборке выдается ошибка кодовых данных.

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Contact"];
    [request setIncludesPendingChanges:NO];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name.fname.string" ascending:YES];
    [request setSortDescriptors:@[sortDescriptor]];
    _fetchController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                           managedObjectContext:[BCSCoreDataInterface sharedInstance].mainQueueContext
                                                            sectionNameKeyPath  :@"name.fname.stringGroupByFirstInitial"                                                   cacheName            :nil];

    self.fetchController.delegate = self;

    NSError *error = nil;

    if (![self.fetchController performFetch:&error]) {
        // error handling
    }

person Bhargavi    schedule 28.07.2014    source источник
comment
Можете ли вы опубликовать подробности ошибки?   -  person Danny S    schedule 28.07.2014
comment
@DanSpag CoreData: ошибка: (NSFetchedResultsController) Извлеченный объект с индексом 2 имеет неупорядоченное имя раздела «A. Объекты должны быть отсортированы по названию раздела'   -  person Bhargavi    schedule 28.07.2014
comment
я думаю, что _fetchcontroller сам назначает свойство fetchcontroller   -  person Bhargavi    schedule 28.07.2014
comment
код не работал, так как атрибут имени fname имеет трансформируемый тип. у него не было геттера или строки свойства.   -  person Bhargavi    schedule 30.07.2014
comment
изменение fname с трансформируемого на строковый тип является решением для этого!!   -  person Bhargavi    schedule 30.07.2014


Ответы (1)


Попробуйте использовать

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name.fname.string" ascending:YES selector:@selector(caseInsensitiveCompare:)];

ИЗМЕНИТЬ

Как я вижу, вы устанавливаете свой дескриптор сортировки как «name.fname.string», но первый дескриптор сортировки, который вы передаете контроллеру результатов, будет сортировать раздел, а ваш дескриптор сортировки не соответствует sectionNameKeyPath. Поэтому вам нужно добавить первый дескриптор сортировки для сортировки разделов, а затем второй для сортировки строк в каждом разделе. Итак, попробуйте следующее:

NSSortDescriptor *sectionSort = [[NSSortDescriptor alloc] initWithKey@"name.fname.stringGroupByFirstInitial" ascending:YES];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name.fname.string" ascending:YES];

[request setSortDescriptors: @[sectionSort, sortDescriptor]];

Удачи.

person Danny S    schedule 28.07.2014