Vì không có hỗ trợ cho unsigned long long
trong Dữ liệu cốt lõi, bạn có thể cần phải tự mình "tự lừa".
Một trong những ý tưởng là để lưu trữ các giá trị như ... dữ liệu nhị phân, và xác định accessors tùy chỉnh mà trả lại dữ liệu như uint64_t
:
// header
@interface Event : NSManagedObject
@property (nonatomic, retain) NSData * timestamp;
- (void)setTimestampWithUInt64:(uint64_t)timestamp;
- (uint64_t)timestampUInt64;
@end
// implementation
@implementation Event
@dynamic timestamp;
- (void)setTimestampWithUInt64:(uint64_t)timestamp
{
self.timestamp = [NSData dataWithBytes:×tamp length:sizeof(timestamp)];
}
- (uint64_t)timestampUInt64
{
uint64_t timestamp;
[self.timestamp getBytes:×tamp length:sizeof(timestamp)];
return timestamp;
}
@end
Có vẻ như để làm công việc. Đoạn code dưới đây:
Event *event = [NSEntityDescription insertNewObjectForEntityForName:@"Event"
inManagedObjectContext:self.managedObjectContext];
uint64_t timestamp = 119143881477165;
NSLog(@"timestamp: %llu", timestamp);
[event setTimestampWithUInt64:timestamp];
[self.managedObjectContext save:nil];
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Event"];
Event *retrievedEvent = [[self.managedObjectContext executeFetchRequest:request
error:nil] lastObject];
NSLog(@"timestamp: %llu", [retrievedEvent timestampUInt64]);
Đầu ra:
2012-03-03 15:49:13.792 ulonglong[9672:207] timestamp: 119143881477165
2012-03-03 15:49:13.806 ulonglong[9672:207] timestamp: 119143881477165
một hack như thế này tất nhiên thêm một mức gián tiếp, và nó có thể ảnh hưởng đến hiệu suất khi timestamp
được sử dụng rất nhiều.
Cảm ơn rất nhiều vì đã dành thời gian để gửi câu trả lời chi tiết này, @ayoy. NSData là một tùy chọn mà tôi đã xem xét, nhưng tôi hơi ngạc nhiên khi phát hiện ra rằng các giá trị dài dài chưa được ký không được Core Data hỗ trợ ra khỏi hộp. Dù sao, giải pháp của bạn hoạt động hoàn toàn tốt đẹp. –