使用Core Data存储unsigned long long

时间:2012-03-03 14:31:01

标签: core-data unsigned-long-long-int

此问题的变体已被问及herehere,但似乎问题没有得到明确答案。

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

2 个答案:

答案 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:&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被大量使用时,它可能会影响性能。

答案 1 :(得分:1)

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

即:

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