5

已在此处此处询问了此问题的变体,但似乎该问题尚未得到明确的答案。

我面临的问题是 MPMediaLibrary 框架将每个 MPMediaItem(音乐、视频、播客……)的引用保留为 usigned long long (uint64_t),但我似乎找不到存储此值的方法使用核心数据。使用 Integer 64 作为数据类型似乎并不能解决问题,我也没有看到替代方案。

4

2 回答 2

7

由于在 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:&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

像这样的 hack 当然会增加一定程度的间接性,并且在timestamp大量使用时可能会影响性能。

于 2012-03-03T14:59:02.850 回答
2

虽然这种情况下的上下文非常晚,但我相信我不是唯一一个会偶然发现它的人。对于 MPMediaLibrary,将 ID 存储为 NSString:

IE:

[NSString stringWithFormat:@"%@", [currentMediaItem valueForProperty:MPMediaEntityPropertyPersistentID]];
于 2013-02-20T16:53:41.957 回答