この質問のバリエーションがこことここで尋ねられましたが、質問には明確な回答が得られていないようです.
私が直面している問題は、MPMediaLibrary フレームワークが各 MPMediaItem (音楽、ビデオ、ポッドキャストなど) への参照を ussigned long long (uint64_t) として保持していることですが、この値を格納する方法が見つからないようです。コアデータを使用。データ型として Integer 64 を使用してもうまくいかないようで、代替手段がありません。
Core Dataではサポートされていないためunsigned long long
、文字通り自分で「トリックを実行」する必要がある場合があります。
アイデアの 1 つは、値を ...binary データとして格納し、データを次のように返すカスタム アクセサーを定義すること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]];