2012-03-03 2 views
5

이 질문에 대한 변형은 herehere으로 질문되었지만 명확한 대답을 얻지 못한 것으로 보입니다.코어 데이터를 사용하여 부호없는 long long을 저장하십시오.

내가 직면하는 문제는 MPMediaLibrary 프레임 워크가 각 MPMediaItem (음악, 비디오, Podcast, ...)을 참조 된 long long (uint64_t)으로 유지하지만 그 방법을 찾지 못하는 것입니다. 핵심 데이터를 사용하여이 값을 저장합니다. Integer 64를 데이터 유형으로 사용하는 것은 트릭을 수행하지 않는 것으로 보이고 대안을 보지 못합니다.

답변

7

핵심 데이터에 unsigned long long에 대한 지원이 없으므로 문자 그대로 "트릭을 수행"해야 할 수 있습니다.

// 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 

일을 할 것 같다 : 아이디어의

하나는 ... 이진 데이터 값을 저장하고, uint64_t로 데이터를 반환하는 사용자 정의 접근을 정의하는 것입니다. 아래의 코드 :

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 

A는 물론이 같은 해킹은 간접 수준을 추가하고, timestamp 많이 사용하는 경우는 성능에 영향을 미칠 수 있습니다.

+0

감사합니다. NSData는 제가 고려한 옵션 이었지만, 코어 데이터는 코딩되지 않은 long long 값을 지원하지 않습니다. 어쨌든, 당신의 솔루션은 완벽하게 작동합니다. –

1

이 경우 컨텍스트가 너무 늦기는하지만, 필자는이 컨텍스트가 우연히 만나는 유일한 것이 아니라고 확신합니다. 대신있는 NSString으로 ID를 저장하는 MPMediaLibrary의 경우, :

예 : @ayoy를이 상세하게 답변을 제출하기 위해 시간을내어 주셔서 대단히

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