2012-03-03 181 views
5

已經詢問herehere這個問題的變體,但似乎該問題還沒有得到明確的答案。使用核心數據存儲無符號long long

我面對的問題是MPMediaLibrary框架將每個MPMediaItem(音樂,視頻,播客......)作爲一個長整型(uint64_t)的引用,但我似乎無法找到一種方法使用Core Data存儲這個值。使用Integer 64作爲數據類型似乎沒有辦法,我沒有看到替代方案。

回答

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它可能會影響性能。

+0

非常感謝您抽出時間來提交此詳細答案,@ayoy。 NSData是我考慮過的一個選項,但是我驚訝地發現,無符號long long值不被開箱即用的Core Data支持。無論如何,你的解決方案工作得很好。 – 2012-03-03 17:09:40

1

雖然在這種情況下的背景是超晚,但我確信我不是唯一會偶然發現它的人。在MPMediaLibrary的情況下,存儲ID爲的NSString而不是:

即:

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