2012-03-03 34 views
5

Các biến thể của câu hỏi này đã được yêu cầu herehere, nhưng dường như câu hỏi chưa nhận được câu trả lời rõ ràng.Cửa hàng không được đăng ký lâu dài bằng cách sử dụng Dữ liệu chính

Vấn đề mà tôi phải đối mặt là khung công tác MPMediaLibrary giữ tham chiếu tới từng MPMediaItem (nhạc, video, podcast, ...) dưới dạng dài hạn (uint64_t), nhưng dường như tôi không tìm được cách nào để lưu trữ giá trị này bằng cách sử dụng Dữ liệu cốt lõi. Sử dụng Integer 64 vì kiểu dữ liệu dường như không thực hiện thủ thuật và tôi không thấy một giải pháp thay thế.

Trả lời

7

Vì không có hỗ trợ cho unsigned long long trong Dữ liệu cốt lõi, bạn có thể cần phải tự mình "tự lừa".

Một trong những ý tưởng là để lưu trữ các giá trị như ... dữ liệu nhị phân, và xác định accessors tùy chỉnh mà trả lại dữ liệu như 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 

Có vẻ như để làm công việc. Đoạn code dưới đây:

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]); 

Đầu ra:

2012-03-03 15:49:13.792 ulonglong[9672:207] timestamp: 119143881477165 
2012-03-03 15:49:13.806 ulonglong[9672:207] timestamp: 119143881477165 

một hack như thế này tất nhiên thêm một mức gián tiếp, và nó có thể ảnh hưởng đến hiệu suất khi timestamp được sử dụng rất nhiều.

+0

Cảm ơn rất nhiều vì đã dành thời gian để gửi câu trả lời chi tiết này, @ayoy. NSData là một tùy chọn mà tôi đã xem xét, nhưng tôi hơi ngạc nhiên khi phát hiện ra rằng các giá trị dài dài chưa được ký không được Core Data hỗ trợ ra khỏi hộp. Dù sao, giải pháp của bạn hoạt động hoàn toàn tốt đẹp. –

1

Trong khi bối cảnh trong trường hợp này là siêu muộn, tôi chắc chắn tôi không phải là người duy nhất sẽ vấp ngã khi nó. Trong trường hợp của MPMediaLibrary, tàng trữ ID như một NSString thay vì:

ví dụ:

[NSString stringWithFormat:@"%@", [currentMediaItem valueForProperty:MPMediaEntityPropertyPersistentID]]; 
Các vấn đề liên quan