2011-03-23 13 views
8

मेरी स्थिति सरल है: मेरे पास मेरे मूल डेटा स्टोर में कुछ रिकॉर्ड हैं। उनके गुणों में से एक "स्थानीय आईडी" नामक एक स्ट्रिंग है। एक बिंदु है जहां मैं एक विशेष स्थानीय आईडी मूल्य के साथ रिकॉर्ड खोजना चाहता हूं। ऐसा करने का स्पष्ट तरीका एक NSFetchRequest और NSPredicate के साथ है। हालांकि, जब मैं इसे सेट करता हूं, तो अनुरोध शून्य रिकॉर्ड देता है।NSPredicate रिटर्न अनुरोध के साथ कोई परिणाम नहीं, ऐरे फ़िल्टरिंग के साथ काम करता है

यदि, हालांकि, मैं भविष्य के बिना fetch अनुरोध का उपयोग करता हूं, सभी रिकॉर्ड लौटाता हूं, और लक्ष्य स्थानीय स्थानीय मूल्य की तलाश में केवल लूप का उपयोग करता हूं, मुझे वह रिकॉर्ड मिलता है जिसे मैं ढूंढ रहा हूं। दूसरे शब्दों में, रिकॉर्ड वहां है, लेकिन fetch अनुरोध इसे नहीं ढूंढ सकता है।

मेरी अन्य विधियां जिनमें मैं fetch अनुरोधों और भविष्यवाणियों का उपयोग करता हूं, सभी उम्मीद के अनुसार काम कर रहे हैं। मुझे नहीं पता कि यह क्यों विफल रहा है।

मैं ऐसा करना चाहते हैं:

- (void)deleteResultWithLocalID:(NSString *)localId { 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:[NSEntityDescription entityForName:@"WCAAssessmentResult" inManagedObjectContext:context]]; 
    [request setPredicate:[NSPredicate predicateWithFormat:@"localId == %@", localId]]; 
    NSError *error = nil; 
    NSArray *results = [context executeFetchRequest:request error:&error]; 
    NSAssert(error == nil, ([NSString stringWithFormat:@"Error: %@", error])); 
    if ([results count]) [context deleteObject:[results objectAtIndex:0]]; 
    else NSLog(@"could not find record with localID %@", localId); 
    [self saveContext]; 
} 

लेकिन मैं यह करने के लिए होने अंत:

- (void)deleteResultWithLocalID:(NSString *)localId { 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:[NSEntityDescription entityForName:@"WCAAssessmentResult" inManagedObjectContext:context]]; 
    NSError *error = nil; 
    NSArray *results = [context executeFetchRequest:request error:&error]; 
    NSAssert(error == nil, ([NSString stringWithFormat:@"Error: %@", error])); 
    for (WCAAssessmentResult *result in results) { 
     if ([result.localId isEqualToString:localId]) { 
      NSLog(@"result found, deleted"); 
      [context deleteObject:result]; 
     } 
    } 
    [self saveContext]; 
} 

क्या गलत हो रहा हो सकता है के रूप में किसी भी सुराग?

संपादित

मैंने पाया कि मैं विधेय उपयोग कर सकते हैं मैं परिणाम के बाद लाने का अनुरोध निष्पादित कर दिया गया है मैं उम्मीद पाने के लिए बना रहा हूं। तो, निम्नलिखित भी काम करता है:

- (WCAChecklistItem *)checklistItemWithId:(NSNumber *)itemId { 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:[NSEntityDescription entityForName:@"WCAChecklistItem" inManagedObjectContext:context]]; 
    NSArray *foundRecords = [context executeFetchRequest:request error:nil]; 
    foundRecords = [foundRecords filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"serverId == %@", itemId]]; 
    if ([foundRecords count]) { 
     return [foundRecords objectAtIndex:0]; 
    } else { 
     NSLog(@"can't find checklist item with id %@", itemId); 
     return nil; 
    } 
} 

अद्यतन

मैं किसी का सामना करना पड़ा और ने इस बहुत समस्या का सामना:

http://markmail.org/message/7zbcxlaqcgtttqo4

वह या तो एक समाधान नहीं मिला है ।

Blimey! मैं उलझन में हूं।

धन्यवाद!

उत्तर

1

यह कहने से नफरत है लेकिन इन प्रकार की समस्याओं का सबसे आम कारण सरल टाइपो है। सुनिश्चित करें कि आपके गुण नाम और भविष्यवाणी समान हैं। सुनिश्चित करें कि आपकी संपत्ति के नाम और विशेषता नाम समान हैं। यदि किसी संपत्ति का संदर्भ काम करता है लेकिन विशेषता नाम का संदर्भ शायद कोई मेल नहीं खाता है।

[result valueForKey:@"localID"] 

... की वापसी के साथ:

आप की वापसी की तुलना द्वारा बाद के लिए परीक्षण कर सकते हैं

result.localID 
+0

संकेत के लिए धन्यवाद! मैं जाउंगा और सुनिश्चित करूँगा कि मुझे चीजें सही ढंग से वर्तनी मिली हैं। यह समस्या कई विशेषताओं में हो रही है, हालांकि, मुझे लगता है कि यह कुछ और मौलिक है। उम्मीद है कि मैं गलत हूँ! विल रिपोर्ट वापस। एक बार फिर धन्यवाद। – CharlieMezak

+0

आप जानते हैं, यह समस्या नहीं हो सकती है, क्योंकि जैसा कि मैंने अपने प्रश्न में कहा है, मैं उसी भविष्यवाणी का उपयोग करके परिणामों को फ़िल्टर करने में सक्षम हूं, मैं fetch अनुरोध में उपयोग करने का प्रयास कर रहा हूं। इसलिए भविष्यवाणी स्वयं समस्या नहीं हो सकती है, कम से कम वर्तनी के मामले में नहीं। परिणाम अनुमान लगाने के लिए एक अनुमान वैध क्यों होगा लेकिन fetch अनुरोध नहीं? – CharlieMezak

+0

उपरोक्त कोड सटीक एक ही अनुमानित नहीं दिखाता है। इसके अलावा, यदि आपके पास NSManagedObject उपclass परिभाषित हैं, तो आप एक संपत्ति नाम बना सकते हैं जो इकाई संपत्ति नाम से सहमत नहीं है। एक प्राप्तकर्ता इकाई संपत्ति के नाम की तलाश करेगा जबकि सरणी पर एक अनुमान वर्ग संपत्ति नाम देखेंगे। – TechZen

4

यदि localId एक संख्यात्मक मान है, तो आपको ऑब्जेक्ट का उपयोग NSString के बजाय अनुमानित गठन में करना चाहिए।

[request setPredicate:[NSPredicate predicateWithFormat:@"localId == %@", 
    [NSNumber numberWithString:localId]]]; 

NSPredicate प्रारूप तार स्वचालित रूप से NSString वस्तुओं बोली।

+0

धन्यवाद!यह एक अच्छा मुद्दा है, लेकिन स्थानीय आईडी एक स्ट्रिंग मान है। तो मुझे नहीं लगता कि यह मुद्दा है। मैं इसे स्पष्ट करने के लिए अपना प्रश्न संपादित करूंगा। – CharlieMezak

+1

और अब ऐसा लगता है कि स्ट्रिंग और संख्यात्मक मानों के लिए, मेरे सभी संभावित fetch अनुरोधों के लिए समस्या आम है! AArrg! – CharlieMezak

संबंधित मुद्दे