2012-03-03 16 views
5

この質問のバリエーションはherehereと尋ねられましたが、質問には明確な答えがないようです。コアデータを使用してunsigned long longを格納する

私が直面している問題は、MPMediaLibraryフレームワークが各MPMediaItem(音楽、ビデオ、ポッドキャストなど)への参照をusigned long long(uint64_t)として保持していますが、コアデータを使用してこの値を保存します。データ型として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は私が検討していたオプションでしたが、私は、unsigned long long値がCore Dataでサポートされていないことを知るために少し驚きました。とにかく、あなたのソリューションは完璧に動作します。 –

1

この場合のコンテキストは非常に遅いですが、私はそれにつまずく唯一のものではないと確信しています。 MPMediaLibraryの場合は、代わりにNSStringのようIDを格納:

すなわち:

[NSString stringWithFormat:@"%@", [currentMediaItem valueForProperty:MPMediaEntityPropertyPersistentID]]; 
関連する問題