5

この質問のバリエーションがここここで尋ねられましたが、質問には明確な回答が得られていないようです.

私が直面している問題は、MPMediaLibrary フレームワークが各 MPMediaItem (音楽、ビデオ、ポッドキャストなど) への参照を ussigned long long (uint64_t) として保持していることですが、この値を格納する方法が見つからないようです。コアデータを使用。データ型として Integer 64 を使用してもうまくいかないようで、代替手段がありません。

4

2 に答える 2

7

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:&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頻繁に使用されるとパフォーマンスに影響を与える可能性があります。

于 2012-03-03T14:59:02.850 に答える
2

この場合のコンテキストは非常に遅いですが、それに遭遇するのは私だけではないと確信しています. MPMediaLibrary の場合、代わりに ID を NSString として保存します。

すなわち:

[NSString stringWithFormat:@"%@", [currentMediaItem valueForProperty:MPMediaEntityPropertyPersistentID]];
于 2013-02-20T16:53:41.957 に答える