2012-03-03 179 views
5

已经询问herehere这个问题的变体,但似乎该问题还没有得到明确的答案。使用核心数据存储无符号long long

我面对的问题是MPMediaLibrary框架将每个MPMediaItem(音乐,视频,播客......)作为一个长整型(uint64_t)的引用,但我似乎无法找到一种方法使用Core Data存储这个值。使用Integer 64作为数据类型似乎没有办法,我没有看到替代方案。

回答

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:&timestamp length:sizeof(timestamp)]; 
} 

- (uint64_t)timestampUInt64 
{ 
    uint64_t timestamp; 
    [self.timestamp getBytes:&timestamp 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它可能会影响性能。

+0

非常感谢您抽出时间来提交此详细答案,@ayoy。 NSData是我考虑过的一个选项,但是我惊讶地发现,无符号long long值不被开箱即用的Core Data支持。无论如何,你的解决方案工作得很好。 – 2012-03-03 17:09:40

1

虽然在这种情况下的背景是超晚,但我确信我不是唯一会偶然发现它的人。在MPMediaLibrary的情况下,存储ID为的NSString而不是:

即:

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