使用Core Data存储unsigned long long

Bar*_*obs 5 core-data unsigned-long-long-int

这里这里已经提出了这个问题的变化,但似乎这个问题没有得到明确的答案.

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

ayo*_*yoy 7

由于unsigned long longCore Data中不支持,您可能需要自己完成"诀窍".

其中一个想法是将值存储为...二进制数据,并定义返回数据的自定义访问器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
Run Code Online (Sandbox Code Playgroud)

它似乎做了这个工作.代码如下:

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]);
Run Code Online (Sandbox Code Playgroud)

输出:

2012-03-03 15:49:13.792 ulonglong[9672:207] timestamp: 119143881477165
2012-03-03 15:49:13.806 ulonglong[9672:207] timestamp: 119143881477165
Run Code Online (Sandbox Code Playgroud)

像这样的黑客当然会增加间接级别,并且在timestamp大量使用时可能会影响性能.


归档时间:

查看次数:

1869 次

最近记录:

13 年,2 月 前