Dado que no es compatible con unsigned long long
en Core Data, es posible que necesite literalmente "hacer el truco" usted mismo.
Una de las ideas es almacenar el valor como ... datos binarios, y definir métodos de acceso personalizados que devuelven los datos como 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
Parece que hacer el trabajo. El código de abajo:
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]);
Salidas:
2012-03-03 15:49:13.792 ulonglong[9672:207] timestamp: 119143881477165
2012-03-03 15:49:13.806 ulonglong[9672:207] timestamp: 119143881477165
un corte como este, por supuesto, añade un nivel de indirección, y puede afectar al rendimiento cuando se utiliza en gran medida timestamp
.
Muchas gracias por tomarse el tiempo para presentar este detalle respuesta, @ayoy. NS Data fue una opción que consideré, pero me sorprendió un poco descubrir que los datos largos sin firmar no son compatibles con Core Data de fábrica. De todos modos, tu solución funciona perfectamente bien. –