【问题标题】:Store unsigned long long using Core Data使用 Core Data 存储 unsigned long long
【发布时间】:2012-03-21 18:11:46
【问题描述】:

已向herehere 提出了这个问题的变体,但似乎没有得到明确的答案。

我面临的问题是 MPMediaLibrary 框架将每个 MPMediaItem(音乐、视频、播客...)的引用保留为 usigned long long (uint64_t),但我似乎找不到方法使用 Core Data 存储这个值。使用 Integer 64 作为数据类型似乎无法解决问题,而且我没有看到替代方法。

【问题讨论】:

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


    【解决方案1】:

    由于 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 被大量使用时,它可能会影响性能。

    【讨论】:

    • 非常感谢您抽出宝贵时间提交此详细答案,@ayoy。 NSData 是我考虑过的一个选项,但我有点惊讶地发现 Core Data 不支持 unsigned long long 值。无论如何,您的解决方案运行良好。
    【解决方案2】:

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

    即:

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

    【讨论】:

    • 这正是我需要此修复的场景。谢谢,8.5 年后!
    猜你喜欢
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    相关资源
    最近更新 更多