देता है मैं एक अलग संदर्भ से एकत्रित ऑब्जेक्ट आईडी की सरणी का उपयोग करके संदर्भ से प्रबंधित ऑब्जेक्ट पुनर्प्राप्त करने के लिए एक fetch निष्पादित करने का प्रयास कर रहा हूं। हालांकि, fetch एक खाली सरणी के साथ वापस आता है।ऑब्जेक्ट आईडी द्वारा NSManagedObjects की सरणी प्राप्त करना खाली सरणी
"कोर डाटा प्रोग्रामिंग गाइड" link की "विशिष्ट वस्तुओं प्राप्त कर रहा है" खंड से:
आपके आवेदन कई संदर्भों का उपयोग करता है और आप परीक्षण करने के लिए है कि क्या एक वस्तु एक लगातार की दुकान से हटा दिया गया है चाहते हैं , आप फॉर्म स्वयं ==% @ के अनुमान के साथ एक fetch अनुरोध बना सकते हैं। जिस वस्तु को आप चर के रूप में पास करते हैं वह या तो एक प्रबंधित ऑब्जेक्ट या प्रबंधित ऑब्जेक्ट आईडी हो सकता है ... "
यदि आपको कई ऑब्जेक्ट्स के अस्तित्व के लिए परीक्षण करने की आवश्यकता है, तो यह IN ऑपरेटर का उपयोग करने के लिए अधिक कुशल है
NSPredicate * विधेय =: कई फ़ेच उदाहरण के लिए, अलग-अलग वस्तुओं के लिए निष्पादित करने के लिए है [NSPredicate predicateWithFormat: @ "% @ में स्व", arrayOfManagedObjectIDs];
हालांकि इस वस्तु के लिए परीक्षण के बारे में बात कर रही है हटाना, मुझे लगता है कि ऑब्जेक्ट्स हटाए नहीं गए हैं तो परिणाम सरणी खाली नहीं है, और इसमें शामिल होगा वास्तविक एनएसएएनएजेड ऑब्जेक्ट्स। हालांकि, जब मैं इस कोड को निष्पादित करें:
- (NSArray *)managedObjectsOfEntityName:(NSString *)entityName fromObjectIDs:(NSArray *)objectIDs managedObjectContext:(NSManagedObjectContext *)managedObjectContext
{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];
request.predicate = [NSPredicate predicateWithFormat:@"self IN %@", objectIDs];
__autoreleasing NSError *error = nil;
NSManagedObjectID *testID = objectIDs[0];
NSManagedObject *obj = [managedObjectContext existingObjectWithID:testID error:&error];
if (!obj)
{
NSLog(@"Unable to perform fetch. Error: %@", error);
}
error = nil;
NSArray *results = [managedObjectContext executeFetchRequest:request error:&error];
if (!results)
{
NSLog(@"Unable to perform fetch. Error: %@", error);
}
return results;
}
results
सरणी, गैर शून्य और खाली है, जबकि obj
ठीक से भर जाता है।
मैंने स्वच्छता जांच के रूप में existingObjectWithID:
पर स्पष्ट कॉल जोड़ा है, और यह बिना किसी त्रुटि के अपेक्षित ऑब्जेक्ट के साथ आता है।
यहाँ प्रासंगिक चर के लिए डिबगर उत्पादन है:
(lldb) po entityName
Foo
(lldb) po objectIDs
<__NSArrayI 0x1170d4950>(
0xd0000000055c0082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p343>,
0xd000000008e80082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p570>,
0xd000000008840082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p545>,
0xd000000006040082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p385>,
0xd000000007740082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p477>,
0xd000000008280082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p522>,
0xd000000008e40082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p569>
)
(lldb) po request
<NSFetchRequest: 0x10f338840> (entity: Foo; predicate: (SELF IN {
0xd0000000055c0082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p343>,
0xd000000008e80082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p570>,
0xd000000008840082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p545>,
0xd000000006040082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p385>,
0xd000000007740082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p477>,
0xd000000008280082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p522>,
0xd000000008e40082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p569>});
sortDescriptors: ((null)); type: NSManagedObjectResultType;)
(lldb) po request.predicate
SELF IN {
0xd0000000055c0082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p343>,
0xd000000008e80082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p570>,
0xd000000008840082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p545>,
0xd000000006040082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p385>,
0xd000000007740082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p477>,
0xd000000008280082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p522>,
0xd000000008e40082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p569>}
(lldb) po testID
0xd0000000055c0082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p343>
(lldb) p testID.isTemporaryID
(bool) $7 = false
(lldb) p obj
(NSManagedObject *) $9 = 0x000000010f338630
(lldb) po results
<__NSArrayI 0x10f205c70>(
)
(lldb) po testID.entity
nil
testID
पर nil
entity
अजीब है, लेकिन मुझे यकीन है कि नहीं कर रहा हूँ "बुरा।"
तो, मुझे स्पष्ट रूप से नुकसान हुआ है कि क्यों fetch खाली वापस आ रहा है। इकाई का नाम सही है, लाने और भविष्यवाणी अच्छी लगती है, और वस्तु संदर्भ में है, लेकिन फिर भी शून्य परिणाम।
अतिरिक्त प्रसंग:
अनिवार्य रूप से, बड़ी तस्वीर है कि मैं जो कुछ काम करने के लिए अपने स्वयं के प्रबंधित ऑब्जेक्ट संदर्भ (एमओसी) का उपयोग करता है एक पृष्ठभूमि आपरेशन है। मुख्य कतार पर उस काम के परिणाम की आवश्यकता होती है, इसलिए मैं काम से उत्पन्न ऑब्जेक्ट आईडी को पैकेज करता हूं और उन्हें मुख्य कतार में भेजता हूं। मुख्य कतार पर मुझे वास्तविक प्रबंधित वस्तुओं की आवश्यकता है, इसलिए मैं मुख्य कतार के एमओसी से ऑब्जेक्ट आईडी द्वारा उन्हें लाने की कोशिश कर रहा हूं। मुझे लगता है मैं इन वस्तुओं को पाने के लिए एमओसी पर objectWithID:
या existingObjectWithID:error:
या यहाँ तक कि objectRegisteredForID:
उपयोग कर सकते हैं, लेकिन प्रत्येक अपने स्वयं के विशेष मुद्दे हैं:
objectWithID:
एक वस्तु जो फर्जी है अगर वस्तु के संदर्भ में नहीं है वापस कर सकती है, और यदि यह संदर्भ में है तो यह एक गलती वापस कर देगा।existingObjectWithID:error:
बहुत अच्छा है, क्योंकि हमnil
(एक फर्जी ऑब्जेक्ट के बजाए) वापस प्राप्त करेंगे लेकिन यह भी एक गलती देता है।objectRegisteredForID:
nil
वापस करेगा यदि ऑब्जेक्ट पहले से ही संदर्भ में नहीं है।
तो, अगर मैं एक पाश में या तो objectWithID:
या existingObjectWithID:error:
का उपयोग की वस्तुओं का एक समूह प्राप्त करने के लिए, जो संभावित रूप से मौजूदा दुकान में n
यात्राएं वस्तुओं गलती करने के लिए है, जिसका अर्थ प्रदर्शन संभावित भयानक होने जा रहा है। अगर मैं objectRegisteredForID:
का उपयोग करता हूं तो मुझे ऑब्जेक्ट बिल्कुल नहीं मिल सकता है अगर यह मुख्य कतार के एमओसी में पहले से नहीं होता है।
तो, सरणी पर पुनरावृत्ति करने की कोशिश करने के बजाय, मुझे उम्मीद है कि एक प्राप्त अनुरोध निरंतर स्टोर के साथ बातचीत करने के ऊपरी हिस्से को सीमित करेगा और मुझे आवश्यक सभी वस्तुओं को वापस करने में मदद मिलेगी।
अलावा:
के रूप में एक अलग रूप में, इस मुद्दे वास्तव में लगता है जैसे यह @"self IN %@"
विधेय के साथ क्या करना है, के बाद से मुझे लगता है कि विधेय को हटा दें और इस मुद्दे को बिना entityName
की सभी वस्तुओं को लाने कर सकते हैं। मैंने @"objectID IN %@"
को उसी (शून्य) परिणामों के साथ पूर्वानुमान के रूप में भी आजमाया है।
आपका वस्तु एक उचित वस्तु की तरह नहीं लगती है। शून्य 'इकाई' एक सुराग है: आपकी ऑब्जेक्ट आईडी के बारे में कुछ ख़राब है। आपका पोस्ट कोड ठीक दिखता है। क्या 'फू' इकाई सही है? – Mundi
@Mundi आपको क्या लगता है कि वस्तु सही नहीं है?मैंने obj की पीओ की आपूर्ति नहीं की क्योंकि यह वास्तव में वस्तु को प्रिंट करता है और यह यहां बहुत अधिक जानकारी साझा कर रहा है। "फू" असली इकाई नाम नहीं है, लेकिन फू को खोज और प्रतिस्थापित करके प्रतिस्थापित किया गया था (केवल नाम आईपी की रक्षा के लिए बदल दिए गए हैं)। धन्यवाद। – levigroker
तथ्य यह है कि 'इकाई' विशेषता शून्य है, यह बेहद संदिग्ध है। मुझे यकीन नहीं है कि इसका क्या कारण होगा, लेकिन यह आईडी ऑब्जेक्ट्स को किसी तरह से फर्जी या टूटा होने का संदेह करता है। –