NSManagedObjectID في NSData
سؤال
وجدت هذا رائع 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 إلى القرص بدلا من ذلك:
- جعل سمة جديدة على كيان يسمى "الهوية"
- جعل سمة جديدة على entitys الأم كيان يسمى "myEntitysMaxId"
- تجاوز entitys الوالدين تنفيذ "addNewMyEntityObject:"
- هناك زيادة "myEntitysMaxId" و تعيين هذه القيمة الجديدة entitys "id"
- تفعل كما تفعل عادة عند جلب كيان على أساس خصائصه!
أنظف بكثير و أفضل!