NSSortDescriptor для сортировки NSFetchRequest неожиданно - PullRequest
1 голос
/ 21 мая 2010

У моей сущности есть свойство (sortOrder), имеющее тип Decimal (NSDecimalNumber), но когда я выполняю запрос на выборку, используя это свойство в качестве ключа, я получаю обратно результаты в, казалось бы, случайном порядке. Если я выведу значение свойства, я получу действительно странные значения, пока не получу intValue.

Пример: первый запуск дает этот результат. Первое значение - это необработанное значение свойства. Вторым является intValue, фактическое значение свойства, когда я создал объект - или, по крайней мере, я думал.

85438160 10

74691424 20

Второй запуск ...

85333744 10

85339168 20

Третий ...

85263696 20

85269568 10

Какого черта?

Запрос на получение:

NSMutableArray *cats = [[NSMutableArray alloc] initWithArray:[CoreDataHelper searchObjectsInContext:@"RestaurantMenuCategory":nil:@"sortOrder":YES:NO:nil]];

Вот метод searchObjectsInContext из моего CoreDataHelperClass:

+(NSMutableArray *) searchObjectsInContext: (NSString*)entityName : (NSPredicate *)predicate : (NSString*)sortKey : (BOOL)sortAscending : (BOOL)distinct : (NSString*)distinctProperty
{
    RestaurantController *ctrl = [RestaurantController sharedRestaurantController];

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:ctrl.managedObjectContext];
    [request setEntity:entity];

    if(distinct==YES){
        [request setReturnsDistinctResults:YES];
    }

    if(distinctProperty!= nil){
        [request setPropertiesToFetch :[NSArray arrayWithObjects:distinctProperty,nil]];
    }

    if(predicate != nil){
        [request setPredicate:predicate];
    }

    if(sortKey != nil){
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortKey ascending:sortAscending];
        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
       [request setSortDescriptors:sortDescriptors];
       [sortDescriptors release];
       [sortDescriptor release];
   }

   NSError *error;

   NSMutableArray *mutableFetchResults = [[[ctrl.managedObjectContext executeFetchRequest:request error:&error] mutableCopy] autorelease];

   [request release];

   return mutableFetchResults;
}

1 Ответ

1 голос
/ 21 мая 2010

Нельзя использовать формат% d для распечатки NSDecimalNumber.

NSDecimalNumber - это объект Objective-C; % d для печати "int" s. Если вы используете строку формата% d, она, вероятно, напечатает что-то бесполезное, например адрес объекта; вместо этого используйте "% @".

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