ios - كيفية الحصول على كائن البيانات الأساسية من معرف كائن محدد؟




macos cocoa core-data nsfetchrequest (3)

يمكنني الحصول بسهولة على معرف الكائن في Core Data باستخدام التعليمة البرمجية التالية:

NSManagedObjectID *moID = [managedObject objectID];

ومع ذلك ، هل هناك طريقة للحصول على كائن خارج مخزن البيانات الأساسي بإعطائه معرف كائن محدد؟ أعلم أنه يمكنني القيام بذلك باستخدام NSFetchRequest ، على النحو التالي:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(objectID = %@)", myObjectID];
[fetchRequest setPredicate:predicate];

ومع ذلك ، أرغب في إجراء ذلك بطريقة لا تشرع في طلب الجلب الخاص بها. أيه أفكار؟


Answers

objectWithID: هي الطريقة التي تبحث عنها ، وهي الطريقة الموصى بها للقيام بذلك. objectWithID: سيستخدم بكفاءة NSManagedObjectContext لسحب الكائن فقط كمستويات عديدة حسب الحاجة - بخلاف بعض الوسائل الأخرى للقيام بذلك. objectWithID: سيتم بشكل صحيح استخدام معلومات في الذاكرة في السياقات الأصل ، منسق المخزن الدائم و المخزن الدائم قبل الانتقال إلى تخزين النسخ الاحتياطي.

تمت تغطية هذا بالتفصيل في دورة WWDC 2012 "أفضل ممارسات البيانات الأساسية".


انت تريد:

-(NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID
                                   error:(NSError **)error

جلب الكائن من المتجر الذي يحتوي على هذا المعرف ، أو لا شيء إذا لم يكن موجودًا.

(كن على دراية: هناك طريقتان على NSManagedObjectContext مع أسماء متشابهة يبدو أنها أوقعتني. للمساعدة على إبقائها مستقيمة ، إليك ما تفعله الأمرين الأخريين:

-(NSManagedObject *)objectWithID:(NSManagedObjectID *)objectID

... سيؤدي إلى إنشاء كائن خطأ مع objectID الموفر ، سواء كان كائنًا موجودًا بالفعل في المخزن أم لا. إذا لم يكن موجودًا ، فسوف يفشل أي شيء يوجه الخطأ ما لم تقم بإدراج الكائن أولاً مع insertObject الخاص بـ insertObject: 's insertObject: الاستخدام الوحيد الذي وجدته لهذا هو نسخ الكائنات من مخزن إلى مخزن مع الحفاظ على ObjectIDs.

-(NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectID

... سيعود إلى الكائن الذي يحتوي على هذا المعرف ، إذا كان قد تم جلبه من المتجر بواسطة ملف managedObjectContext هذا. إذا كان أي شخص يعرف ما هي هذه الطريقة مفيدة ، يرجى التعليق.)

[eta .: هناك اختلاف مهم آخر بين الطريقة الأولى والثاني الآخر هو أن existingObjectWithID:error: never return a fault؛ دائمًا يجلب لك الكائن كله. إذا كنت تحاول تجنب ذلك (على سبيل المثال ، العمل باستخدام كائن مكلف إلى إحضار خاصية blob كبيرة) ، فيجب أن تكون ذكيًا مع objectWithID: أو objectRegisteredForID: ، الذي لا يطلق العيوب ؛ أو استخدام طلب الجلب الذي تمت تهيئته بشكل صحيح.]


استخدم easy_install لتحديث pip إلى أحدث إصدار:

sudo easy_install -U pip

تأكد أيضًا من تثبيت أحدث XCode (الإصدار 4.4) باستخدام Command Line Tools .





ios macos cocoa core-data nsfetchrequest