2012-03-03 11 views
5

का उपयोग कर लंबे समय तक हस्ताक्षरित स्टोर here और here से पूछा गया है, लेकिन ऐसा लगता है कि प्रश्न को स्पष्ट उत्तर नहीं मिला है।स्टोर कोर डेटा

मुझे जिस समस्या का सामना करना पड़ता है वह यह है कि एमपीएमडिया लाइब्रेरी फ्रेमवर्क प्रत्येक MPMediaItem (संगीत, वीडियो, पॉडकास्ट, ...) को एक लंबे समय तक (uint64_t) के रूप में संदर्भित करता है, लेकिन मुझे कोई रास्ता नहीं दिख रहा है कोर डेटा का उपयोग करके इस मूल्य को स्टोर करने के लिए। डेटा प्रकार के रूप में इंटीजर 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 के रूप में डेटा वापस कस्टम accessors परिभाषित करने के लिए है। नीचे दिए गए कोड:

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 प्रस्तुत करने के लिए के लिए बहुत ज्यादा। एनएसडाटा एक विकल्प था जिसे मैंने माना था, लेकिन मुझे यह जानकर आश्चर्य हुआ कि बॉक्स के बाहर कोर डेटा द्वारा हस्ताक्षरित लंबे समय तक मूल्य समर्थित नहीं हैं। वैसे भी, आपका समाधान पूरी तरह से ठीक काम करता है। –

1

हालांकि इस मामले में संदर्भ बहुत देर हो चुकी है, मुझे यकीन है कि मैं अकेला नहीं हूं जो उस पर ठोकर खाएगा। MPMediaLibrary के मामले में, आईडी एक NSString बजाय के रूप में संग्रहीत करने में:

अर्थात्:

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