已在此处和此处询问了此问题的变体,但似乎该问题尚未得到明确的答案。
我面临的问题是 MPMediaLibrary 框架将每个 MPMediaItem(音乐、视频、播客……)的引用保留为 usigned long long (uint64_t),但我似乎找不到存储此值的方法使用核心数据。使用 Integer 64 作为数据类型似乎并不能解决问题,我也没有看到替代方案。
由于在 Core Data 中不支持,因此unsigned long long
您可能需要自己“做这个把戏”。
其中一个想法是将值存储为...二进制数据,并将返回数据的自定义访问器定义为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
它似乎完成了这项工作。下面的代码:
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]);
输出:
2012-03-03 15:49:13.792 ulonglong[9672:207] timestamp: 119143881477165
2012-03-03 15:49:13.806 ulonglong[9672:207] timestamp: 119143881477165
像这样的 hack 当然会增加一定程度的间接性,并且在timestamp
大量使用时可能会影响性能。
虽然这种情况下的上下文非常晚,但我相信我不是唯一一个会偶然发现它的人。对于 MPMediaLibrary,将 ID 存储为 NSString:
IE:
[NSString stringWithFormat:@"%@", [currentMediaItem valueForProperty:MPMediaEntityPropertyPersistentID]];