سؤال

وجدت هذا رائع NSManagedObjectID.سيكون هذا جيد جدا بالنسبة الرجوع كيان/NSManagedObject/NSEntityDescription, صحيح ؟
دعونا الحصول على هوية من كيان:

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

لذا...أي فكرة عن كيفية الحصول على هذا objID في سلسلة ؟ أو أفضل:NSData.فعلا شيء أن تكون قادرة على توفير ذلك إلى NSUserDefaults.;-)

راجع للشغل:NSFetchRequest لا تريد أن تعمل في حالتي.أنا استخدم نسخة معدلة من هذا المثال: الجواب من السؤال القديم.

هل كانت مفيدة؟

المحلول

لتحصل على URI أرشفة الموافق 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];

نصائح أخرى

الوثائق :

<اقتباس فقرة>   يمكن أن تتحول

ومعرفات كائن إلى   URI التمثيل التي يمكن أن تكون   أرشفة وصوغه في وقت لاحق للإشارة   العودة إلى كائن معين (باستخدام   managedObjectIDForURIRepresentation:   (NSPersistentStoreCoordinator) و   objectWithID:   (NSManagedObjectContext). فمثلا،   مجموعة مختارة مشاركة في   يمكن تخزينها في تطبيق   التخلف المستخدم من خلال مجموعة   ID الكائن. يمكنك أيضا استخدام الكائن   تمثيلات ID URI لتخزين "ضعيفة"   العلاقات عبر مخازن المستمرة   (حيث ينضم لا يصعب هو ممكن).

ومجرد تحويلها إلى URL ثم تحويل ذلك إلى سلسلة أو بيانات.

هل نظرتم <لأ href = "http://developer.apple.com/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectID_Class/Reference/NSManagedObjectID.html#//apple_ref/occ/instm/NSManagedObjectID/ URIRepresentation "يختلط =" نوفولو noreferrer "> URIRepresentation ؟ فإنه من السهل لتحويل NSURL إلى NSString، والتي لNSData.

وأنت لا تحتاج إلى تحويل NSURL إلى NSString قبل الأرشفة. فقط أرشفة NSURL.

تحرير: لقد علمت مؤخرا أن ID كائن يمكن أن تتغير، مثل بعد الهجرة. ولذلك يبدو وكأنه ليست فكرة جيدة لحفظ ID إلى القرص تتوقع أن تكون قادرا على مرجع الكائن لاحقا.

هنا هي أنظف و أقصر طريقة وجدتها للقيام بذلك حاليا ، باستخدام 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];
 }

كما @بريستون قال: لا حفظ objectID إلى القرص بدلا من ذلك:

  1. جعل سمة جديدة على كيان يسمى "الهوية"
  2. جعل سمة جديدة على entitys الأم كيان يسمى "myEntitysMaxId"
  3. تجاوز entitys الوالدين تنفيذ "addNewMyEntityObject:"
  4. هناك زيادة "myEntitysMaxId" و تعيين هذه القيمة الجديدة entitys "id"
  5. تفعل كما تفعل عادة عند جلب كيان على أساس خصائصه!

أنظف بكثير و أفضل!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top