Core Data unsigned long long best practice

时间:2014-09-23 14:14:07

标签: ios objective-c core-data unsigned unsigned-long-long-int

我需要在uint64_t属性中存储Core Data个号码。我还需要在谓词中使用这个属性 问题是,Core Data只有Integer64类型,我无法对该属性执行获取请求。
例如:

    NSNumber *pid = @(9224992848802061623ULL); // some unsigned long long  

    // create a person with this id     
    Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.context];
    person.personId = pid; // personId is core data NSNumber property typed integer 64

    [self.context save:nil];

    // now try to fetch this person we just added
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
    request.predicate = [NSPredicate predicateWithFormat:@"personId == %@", pid];  

    NSArray *match = [self.context executeFetchRequest:request error:nil];
    // NO RESULTS!  

正如你在这里看到的那样,当我试图获取与我刚创建的人相同的人时,我没有得到任何结果。
我假设问题是Core Data将其存储为签名,因此值不同,但我该如何解决?

排序怎么样?假设我想要一个也按personId排序的获取请求?现在发生的是大数字变为负数(因为它们被视为已签名),因此它们排序到列表的开头。

处理unsigned long long和Core Data时最好的做法是什么?

1 个答案:

答案 0 :(得分:1)

我建议使用NSDecimalAttributeType存储这些内容。这应该能够支持任何64位数字并正确排序。

或者,你可以将它们存储为二进制数据,因为它们可能是或多或少不透明的标识符。