Как я могу сделать нечувствительный к регистру вид NSFetchedResultsController, который также игнорирует такие слова, как «the»? - PullRequest
3 голосов
/ 13 сентября 2011

Я работаю над приложением Core Data, в котором есть 2 сущности, требующие особой сортировки в NSFetchedResultsController.

В более простом случае 2 просто игнорируется «The», так что (& IЯ привожу примеры реальных данных) Фестиваль посадки следует за фестивалем Peats Ridge в порядке сортировкиВ целях безопасности я бы также хотел, чтобы такой регистр не учитывался.Для этого я попробовал предложения здесь Как я могу отсортировать NSTableColumn из NSStrings, игнорируя "The" и "A"? , добавив ...

@property (nonatomic, readonly) NSString * sortname;

к интерфейсу моегокласс определения сущности & ...

- (NSString *)sortname
{
    NSMutableString *temp = [NSMutableString stringWithString:[[self name] lowercaseString]];
    if ([temp hasPrefix:@"the "]) {
        return [temp substringFromIndex:4];
    }
    return temp;
}

для реализации, но приложение вылетает, когда я даю ему @"sortname" в качестве ключа для NSSortDescriptor.

2-я сущность болеесложно.В дополнение к удалению «The» для сортировки есть также «A» и honififics, такие как «Dr» и «Professor», но не всегда.Примером в данных является театр кукол профессора Яна Лоу и профессора Уоллеса.Йен Лоу - реальный человек, которого (насколько я его уважаю) следует отсортировать по I для Ian, но профессора Уоллеса нет, это просто имя в, ну, кукольном театре, и его следует отсортировать по P. Для этого избирательногоаспект этого я не вижу, кроме как наличие в сущности логического атрибута, указывающего, следует ли удалять 1-е слово для целей сортировки.

В остальном вопрос сводится к ... Есть лиспособ создания (из-за отсутствия более правильного термина) виртуального атрибута в сущности Core Data, который будет работать, когда я передам его имя в качестве ключа для NSSortDescriptor из NSFetchedResultsController?

Отчаянный подход, который я бы предпочел не использовать, заключался бы в создании реальных sortname атрибутов для этих двух сущностей и вычислении значений при заполнении сущностей.

Обновление ... Попытка следовать ответу TechZenэто конструктор для моего NSFetchedResultsController ...

- (NSFetchedResultsController *)frc
{
    if (_frc) return _frc;

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"EventProfile"
                                              inManagedObjectContext:_moc];
    [request setEntity:entity];
    NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"name"
                                                           ascending:YES
                                                          comparator:^NSComparisonResult(id obj1, id obj2) {
        NSMutableString *sortname1 = [NSMutableString stringWithString:[obj1 lowercaseString]];
        if ([sortname1 hasPrefix:@"the "]) {
            sortname1 = [NSMutableString stringWithString:[sortname1 substringFromIndex:4]];
        }
        NSMutableString *sortname2 = [NSMutableString stringWithString:[obj2 lowercaseString]];
        if ([sortname2 hasPrefix:@"the "]) {
            sortname2 = [NSMutableString stringWithString:[sortname2 substringFromIndex:4]];
        }
        return [sortname1 compare:sortname2];
    }];

    [request setSortDescriptors:[NSArray arrayWithObject:sorter]];
    [sorter release], sorter = nil;
    [request setFetchBatchSize:15];

    NSFetchedResultsController *frcTemp = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                              managedObjectContext:_moc
                                                                                sectionNameKeyPath:nil
                                                                                         cacheName:[NSString GetUUID]];
    [self setFrc:frcTemp];
    [_frc setDelegate:self];
    [frcTemp release], frcTemp = nil;
    [request release], request = nil;

    if ([[_frc fetchedObjects] count] == 0) {
        //<#statements#>
    }

    return _frc;
}

Однако он все еще сортируется по имени.Я вставил «Я здесь».строка журнала в блоке компаратора, которая не появилась в моих журналах, что наводит меня на мысль, что компаратор даже не выполняется.

Cheers & TIA, Pedro:)

Ответы [ 2 ]

0 голосов
/ 13 сентября 2011

NSSortDescriptor не принимает временное свойство.Но есть обходной путь.

В NSFetchedResultsController

установите «sectionNameKeyPath» в качестве фильтра и сохраните NSSortDescriptor в качестве реального столбца, найденного в ваших основных данных.Итак, ваш код будет:

NSFetchedResultsController *fetcher = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                                                  managedObjectContext:context
                                                                    sectionNameKeyPath:@"sortname" 
                                                                             cacheName:nil];
0 голосов
/ 13 сентября 2011

Вы, вероятно, хотите использовать дескриптор сортировки с блоком или селектором (функцией), например,

+[NSSortDescriptor sortDescriptorWithKey:ascending:comparator:]

С помощью блока или селектора вы можете создать настолько сложный и настраиваемый вид, сколько вам нужно.

Вы также можете использовать несколько сортировок в одном запросе выборки, просто помните, что сортировки оцениваются в последовательности массива.

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