关于用于NSFetchRequest的Objective C:NSSortDescriptor意外排序

NSSortDescriptor for NSFetchRequest sorting unexpectedly

我的实体有一个类型为Decimal(NSDecimalNumber)的属性(sortOrder),但是当我使用该属性作为键执行获取请求时,我会以看似随机的顺序获取结果。如果我输出该属性的值,那么我会得到真正奇怪的值,直到得到它的intValue。

示例:第一次运行会产生此结果。第一个值是属性的原始值。第二个是intValue,即我创建对象时属性的实际值-或至少是我认为的。

85438160 10

74691424 20

第二次运行...

85333744 10

85339168 20

第三...

85263696 20

85269568 10

什么鬼?

获取请求:

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

这是我的CoreDataHelperClass中的searchObjectsInContext方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
+(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;
}


您不能使用%d格式来打印NSDecimalNumber。

NSDecimalNumber是一个Objective-C对象; %d用于打印" int "。如果您使用%d格式字符串,它可能会打印出一些无用的东西,例如对象的地址。请改用"%@ "。