已经询问here和here这个问题的变体,但似乎该问题还没有得到明确的答案。使用核心数据存储无符号long long
我面对的问题是MPMediaLibrary框架将每个MPMediaItem(音乐,视频,播客......)作为一个长整型(uint64_t)的引用,但我似乎无法找到一种方法使用Core Data存储这个值。使用Integer 64作为数据类型似乎没有办法,我没有看到替代方案。
已经询问here和here这个问题的变体,但似乎该问题还没有得到明确的答案。使用核心数据存储无符号long long
我面对的问题是MPMediaLibrary框架将每个MPMediaItem(音乐,视频,播客......)作为一个长整型(uint64_t)的引用,但我似乎无法找到一种方法使用Core Data存储这个值。使用Integer 64作为数据类型似乎没有办法,我没有看到替代方案。
由于在核心数据中不支持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
它可能会影响性能。
虽然在这种情况下的背景是超晚,但我确信我不是唯一会偶然发现它的人。在MPMediaLibrary的情况下,存储ID为的NSString而不是:
即:
[NSString stringWithFormat:@"%@", [currentMediaItem valueForProperty:MPMediaEntityPropertyPersistentID]];
非常感谢您抽出时间来提交此详细答案,@ayoy。 NSData是我考虑过的一个选项,但是我惊讶地发现,无符号long long值不被开箱即用的Core Data支持。无论如何,你的解决方案工作得很好。 – 2012-03-03 17:09:40