2009-02-05 13 views
13

में मुझे यह अद्भुत एनएसएमएनेज ऑब्जेक्ट आईडी मिला। एंटिटी/एनएसएमएनेज ऑब्जेक्ट/एनएसईएनटीटी डिस्क्रिप्शन को संदर्भित करने के लिए यह बहुत अच्छा होगा, है ना?
की एक इकाई से एक आईडी प्राप्त करते हैं:एनएसडीएटाएडऑब्जेक्टआईडी एनएसडीटा

NSEntityDescription *entity = [self newEntity];  
NSManagedObjectID *objID = [entity objectID]; 

तो ... किसी भी विचार कैसे इस objID एक स्ट्रिंग में पाने के लिए? या बेहतर: एनएसडीटा। वास्तव में एनएसयूसर डीफॉल्ट पर इसे सहेजने में सक्षम होने के लिए कुछ। ;-)

बीटीडब्ल्यू: NSFetchRequest मेरे मामले में काम नहीं करना चाहता है। मैं इस उदाहरण के एक संशोधित संस्करण का उपयोग करता हूं: answer of an old question

उत्तर

37

एक संग्रहीत यूआरआइ एक NSManagedObject के objectID करने के लिए इसी करने के लिए:

NSManagedObject* myMO; 
... 
NSURL *uri = [[myMO objectID] URIRepresentation]; 
NSData *uriData = [NSKeyedArchiver archivedDataWithRootObject:uri]; 

क्रम मूल प्रबंधित वस्तु का एक उदाहरण के लिए वापस पाने के लिए, आपको लगता है कि उदाहरण के पकड़े लगातार दुकान के साथ एक CoreData ढेर की जरूरत है को NSPersistentStoreCoordinator पर पहले ही जोड़ा गया है। तब:

NSData *uriData; 
NSPersistentStoreCoordinator *psc; 
NSManagedObjectContext *moc; //with moc.persistentStoreCoordinator = psc. 
... 
NSURL *uri = [NSKeyedUnarchiver unarchiveObjectWithData:uriData]; 
NSManagedObjectID *moID = [psc managedObjectIDForURIRepresentation:uri]; 
NSManagedObject *myMO = [moc objectWithID:moID]; 
3

क्या आपने URIRepresentation पर देखा था? NSRL को एनएसएसटींग में परिवर्तित करना और एनएसडीटा में परिवर्तित करना आसान है।

5

NSManagedObjectID documentation से:

वस्तु आईडी एक यूआरआई प्रतिनिधित्व जो हो संग्रहीत कर सकते हैं के रूप में तब्दील किया जा सकता है और बाद में निर्मित एक दिया वस्तु को वापस उल्लेख करने के लिए ( managedObjectIDForURIRepresentation का उपयोग कर: (NSPersistentStoreCoordinator) और ऑब्जेक्ट विथिड: (एनएसएमएनेज ऑब्जेक्ट कॉन्टेक्स्ट)। उदाहरण के लिए, एप्लिकेशन में अंतिम चयनित समूहमें संग्रहीत किया जा सकता है 10 उपयोगकर्ता समूह ऑब्जेक्ट की आईडी के माध्यम से चूकता है। आप ऑब्जेक्ट आईडी यूआरआई प्रस्तुतियों को "कमजोर" स्टोर को लगातार स्टोर (जहां कोई कठोर जुड़ाव संभव नहीं है) को स्टोर करने के लिए उपयोग कर सकते हैं।

बस इसे एक यूआरएल में बदल दें और फिर इसे एक स्ट्रिंग या डेटा में बदल दें।

3

आप संग्रहीत करने से पहले एक NSString में NSURL बदलने की आवश्यकता नहीं है। बस NSURL संग्रहित करें।

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

0

रूप @preston कहा,, डिस्क के लिए एक objectId नहीं सहेजते बजाय:

  1. "आईडी"
  2. कहा जाता है तो अपनी इकाई पर एक नई विशेषता बनाओ बुलाया अपने entitys मूल इकाई पर एक नई विशेषता बनाओ "myEntitysMaxId"
  3. अपने entitys माता पिता कार्यान्वयन ओवरराइड "addNewMyEntityObject:"
  4. वहाँ, वृद्धि "myEntitysMaxId" और नए entitys "आईडी" के रूप में है कि मान सेट
  5. करो के रूप में आप सामान्य रूप से जब आप fetc करना एच एक विशेषता है जो इसके गुणों पर आधारित है!

बहुत साफ और बेहतर!

3

यहाँ साफ और सबसे छोटा रास्ता मैं वर्तमान में यह करने के लिए मिल गया है है, setURL और getURL तरीकों 4.0 में जोड़ा का उपयोग कर NSKeyedUnarchiver और NSKeyedArchiver करने के लिए अतिरिक्त कॉल से बचने के लिए:

सेटर:

+ (void)storeSomeObjectId:(NSManagedObjectID *)objectId 
{ 
    [[NSUserDefaults standardUserDefaults] setURL:[objectId URIRepresentation] 
              forKey:@"someObjectIdKey"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

मनुष्य:

+ (SomeManagedObject *)getObjectByStoredId 
{ 
    NSURL *uri = [[NSUserDefaults standardUserDefaults] URLForKey:@"someObjectIdKey"]; 
    NSManagedObjectID *objectId = [self.persistentStoreCoordinator managedObjectIDForURIRepresentation:uri]; 
    SomeManagedObject *object = [self.managedObjectContext objectWithID:objectId]; 
} 
संबंधित मुद्दे