سؤال

تخيل كيان CoreData (على سبيل المثالاسم الشيئ searchEngine).
NSManagedObjectContext يدير بعض "المثيلات" لهذا الكيان.
سيكون المستخدم النهائي قادرًا على اختيار ما يناسبه "standard searchEngine" مع NSPopupButton.
ال selected object يجب ربط NSPopupButton بـ NSUserDefaults.
المشكلة:

1) @محاولة{حفظ}

a) إذا حاولت حفظ "المثيل" المحدد مباشرة في NSUserDefaults، فسيأتي شيء مثل هذا:

-[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value ' (entity: searchEngine; id: 0x156f60  ; data: {
    url = "http://google.de/";
    someAttribute = 1;
    name = "google";
})' of class 'searchEngine'.

b) إذا حاولت تحويل "المثيل" إلى NSData يأتي هذا:

-[searchEngine encodeWithCoder:]: unrecognized selector sent to instance 0x1a25b0

إذن هل هناك أي فكرة عن كيفية الحصول على هذه الكيانات في بيانات متوافقة مع plist؟

2) @محاولة{تسجيلالافتراضيات}

عادة registerDefaults: يتم تنفيذ الطريقة في + (void)initialize.المشكلة هنا هي أنه يتم استدعاء هذه الطريقة قبل أن يقوم CoreData بتحميل الكيانات المحفوظة من قاعدة البيانات الخاصة به.لذلك لا أستطيع تعيين الإعداد الافتراضي لكائن غير موجود، أليس كذلك؟

أعلم أن الأسئلة طويلة ...لكن:حاول {[لي تقديم: التفاصيل]}؛ د

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

المحلول

وأنت لا تريد لمحاولة أرشفة كيان البيانات الأساسية وتخزينها. بدلا من ذلك، يمكنك تخزين مفتاح أو بعض أخرى السمة المعروفة واستخدامه لجلب الكيان عند بدء تشغيل التطبيق يصل.

وبعض رمز المثال (معدلة بشكل طفيف من المثال نشرت في دليل الأساسية البرمجة بيانات ):

NSManagedObjectContext *moc = [self managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription
    entityForName:@"SearchEngine" inManagedObjectContext:moc];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entityDescription];

NSPredicate *predicate = [NSPredicate predicateWithFormat:
    @"engineName LIKE[c] '%@'", selectedEngineName];
[request setPredicate:predicate];

NSError *error = nil;
NSArray *array = [moc executeFetchRequest:request error:&error];
if (array == nil)
{
    // Deal with error...
}

وبهذه الطريقة يمكنك حفظ الاسم في الإعدادات الافتراضية المستخدم وجلب الكيان عند الضرورة.

نصائح أخرى

إذا كنت بحاجة إلى تخزين مرجع إلى كائن مدار محدد، استخدم التمثيل URI من معرف الكائن تمكن بها:

NSURL *moIDURL = [[myManagedObject objectID] URIRepresentation];

وبعد ذلك يمكنك حفظ URL إلى الإعدادات الافتراضية للمستخدم.

لاسترداد كائن مدار، يمكنك استخدام:

NSManagedObjectID *moID = [myPersistentStoreCoordinator managedObjectIDForURIRepresentation:moIDURL];
NSManagedObject *myManagedObject = [myContext objectWithID:moID];

والتحذير الوحيد هو أنه يجب عليك التأكد من أن معرف كائن مدار الأصلي هو دائم - هذه ليست مشكلة إذا كنت قد قمت بحفظ بالفعل كائن، بدلا من ذلك يمكنك استخدام obtainPermanentIDsForObjects:error:

إليك الطريقة الأنظف والأقصر للقيام بذلك حاليًا باستخدام أساليب 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];
 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top