2012-03-03 9 views
5

Вариации этого вопроса были заданы here и here, но, похоже, на этот вопрос не получен ясный ответ.Хранить без знака длинный длинный с использованием данных ядра

Проблема, с которой я сталкиваюсь, заключается в том, что структура MPMediaLibrary хранит ссылку на каждый MPMediaItem (музыку, видео, подкаст, ...) как длинный длинный длинный (uint64_t), но я не могу найти способ для сохранения этого значения с использованием Core Data. Использование Integer 64, поскольку тип данных, похоже, не делает трюка, и я не вижу альтернативы.

ответ

7

Поскольку в Core Data нет поддержки для 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 - это вариант, который я рассматривал, но я был немного удивлен, узнав, что беззнаковые длинные значения не поддерживаются Core Data из коробки. Во всяком случае, ваше решение работает отлично. –

1

Хотя контекст в этом случае очень поздний, я уверен, что я не единственный, кто наткнется на него. В случае MPMediaLibrary, хранящей идентификатор как NSString вместо:

т.е.

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

 Смежные вопросы

  • Нет связанных вопросов^_^