已經詢問here和here這個問題的變體,但似乎該問題還沒有得到明確的答案。使用核心數據存儲無符號long long
我面對的問題是MPMediaLibrary框架將每個MPMediaItem(音樂,視頻,播客......)作爲一個長整型(uint64_t)的引用,但我似乎無法找到一種方法使用Core Data存儲這個值。使用Integer 64作爲數據類型似乎沒有辦法,我沒有看到替代方案。
已經詢問here和here這個問題的變體,但似乎該問題還沒有得到明確的答案。使用核心數據存儲無符號long long
我面對的問題是MPMediaLibrary框架將每個MPMediaItem(音樂,視頻,播客......)作爲一個長整型(uint64_t)的引用,但我似乎無法找到一種方法使用Core Data存儲這個值。使用Integer 64作爲數據類型似乎沒有辦法,我沒有看到替代方案。
由於在覈心數據中不支持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:×tamp length:sizeof(timestamp)];
}
- (uint64_t)timestampUInt64
{
uint64_t timestamp;
[self.timestamp getBytes:×tamp 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
它可能會影響性能。
雖然在這種情況下的背景是超晚,但我確信我不是唯一會偶然發現它的人。在MPMediaLibrary的情況下,存儲ID爲的NSString而不是:
即:
[NSString stringWithFormat:@"%@", [currentMediaItem valueForProperty:MPMediaEntityPropertyPersistentID]];
非常感謝您抽出時間來提交此詳細答案,@ayoy。 NSData是我考慮過的一個選項,但是我驚訝地發現,無符號long long值不被開箱即用的Core Data支持。無論如何,你的解決方案工作得很好。 – 2012-03-03 17:09:40