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
5
A
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:×tamp length:sizeof(timestamp)];
}
- (uint64_t)timestampUInt64
{
uint64_t timestamp;
[self.timestamp getBytes:×tamp 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é.
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
- 1. non signé long long VS non signé long long int
- 2. non signé long long int
- 3. Décalage de bit pour le type long long non signé
- 4. simple non signé long long conversion de tableau
- 5. non signé long long se comporter impair dans C
- 6. Que signifie `long non signé typedef int long ullong;`?
- 7. non signé longtemps long à binaire
- 8. Convertir HICON pour le long non signé
- 9. Lecture long unsigned long en utilisant fscanf()
- 10. Convertir NSString en Non signé long
- 11. type coulée à long signé non signé CUDA?
- 12. Copie des octets les plus bas d'un long long non signé dans un tableau C
- 13. C/C++ long long à Java long
- 14. Division de unsigned long long
- 15. magasin à long float MySQL
- 16. Détection de débordement C++ pour les grands nombres (non signé long long)
- 17. Non signé Long ne contient pas de valeur valide
- 18. Convertir long non signé à datatype jni équivalent?
- 19. Python long type C 'long long'
- 20. non signé long long constant valeur constante par rapport à la valeur multiplicative
- 21. Extension de signe avec unsigned long long
- 22. "long long long" est trop long pour gcc?
- 23. Comment imprimer long long
- 24. tableau long-byte long
- 25. un long fichier long lecture
- 26. long long vs multiplication int
- 27. multiplication non signée long ints
- 28. MSVC++ de manutention unsigned long long int
- 29. Profileur de performances: comment utiliser long non signé pour mesurer le temps en microsecondes?
- 30. VC++ 2010 vs G ++ unsigned long long Différences de débordement
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. –