Since there's no support for unsigned long long
in Core Data you might need to literally "do the trick" yourself.
One of the ideas is to store the value as ...binary data, and define custom accessors that return the data as 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
It seems to do the job. The code below:
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]);
Outputs:
2012-03-03 15:49:13.792 ulonglong[9672:207] timestamp: 119143881477165
2012-03-03 15:49:13.806 ulonglong[9672:207] timestamp: 119143881477165
A hack like this of course adds a level of indirection, and it may affect performance when timestamp
is heavily used.