此问题的变体已被问及here和here,但似乎问题没有得到明确答案。
我面临的问题是MPMediaLibrary框架保留了对每个MPMediaItem(音乐,视频,播客,...)的引用作为一个使用的long long(uint64_t),但我似乎无法找到一种方法使用Core Data存储此值。使用Integer 64作为数据类型似乎不起作用,我没有看到替代方案。
答案 0 :(得分:7)
由于核心数据中不支持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
这样的黑客当然会增加一个间接级别,当timestamp
被大量使用时,它可能会影响性能。
答案 1 :(得分:1)
虽然在这种情况下的背景是超级晚,但我确信我不是唯一会偶然发现它的人。在MPMediaLibrary的情况下,将ID存储为NSString:
即:
[NSString stringWithFormat:@"%@", [currentMediaItem valueForProperty:MPMediaEntityPropertyPersistentID]];