2012-03-03 8 views
5

Des variantes de cette question ont été posées here et here, mais il semble que la question n'a pas reçu de réponse claire. Le problème auquel je suis confronté est que le framework MPMediaLibrary garde une référence à chaque MPMediaItem (musique, vidéo, podcast, ...) en tant qu'usigned long long (uint64_t), mais je n'arrive pas à trouver un moyen pour stocker cette valeur à l'aide des données de base. Utiliser Integer 64 comme type de données ne semble pas faire l'affaire et je ne vois pas d'alternative.Magasin non signé long long utilisant des données de base

Répondre

7

Comme il n'y a pas de support pour unsigned long long dans les données de base, vous devrez peut-être littéralement "faire le tour" vous-même.

L'une des idées est de stocker la valeur en tant que ... les données binaires et définir des accesseurs personnalisés qui renvoient les données 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 

Il semble faire le travail. Le code ci-dessous:

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]); 

Sorties:

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 hack comme celui-ci bien sûr ajoute un niveau d'indirection, et il peut affecter les performances lorsque timestamp est fortement utilisé.

+0

Merci beaucoup d'avoir pris le temps de soumettre cette réponse de détail, @ayoy. NSData était une option que j'ai considérée, mais j'ai été un peu surpris de découvrir que les valeurs longues non signées ne sont pas supportées par Core Data dès la sortie de la boîte. Quoi qu'il en soit, votre solution fonctionne parfaitement bien. –

1

Alors que le contexte dans ce cas est super tard, je suis sûr que je ne suis pas le seul qui trébuchera sur elle. Dans le cas du MPMediaLibrary, stocker l'ID comme NSString à la place:

-à-dire:

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