2012-03-03 9 views
5

Se han formulado variaciones de esta pregunta here y here, pero parece que la pregunta no ha recibido una respuesta clara.Almacenar sin signo de larga duración con Core Data

El problema al que me enfrento es que el marco de MPMediaLibrary guarda una referencia a cada MPMediaItem (música, video, podcast, ...) como un largo (uint64_t) de larga duración, pero parece que no puedo encontrar un camino para almacenar este valor usando Core Data. Usar Integer 64 como tipo de datos no parece ser el truco y no veo una alternativa.

Respuesta

7

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:&timestamp length:sizeof(timestamp)]; 
} 

- (uint64_t)timestampUInt64 
{ 
    uint64_t timestamp; 
    [self.timestamp getBytes:&timestamp 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.

+0

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. –

1

Si bien el contexto en este caso es muy tardío, estoy seguro de que no soy el único que tropezará con él. En el caso de la MPMediaLibrary, almacenar el ID como NSString lugar:

es decir:

[NSString stringWithFormat:@"%@", [currentMediaItem valueForProperty:MPMediaEntityPropertyPersistentID]];