2009-05-09 15 views
7

मैं कोर डेटा के साथ गड़बड़ कर रहा हूं, और मुझे यकीन है कि मुझे कुछ स्पष्ट याद आ रही है, क्योंकि मुझे ऐसा कोई उदाहरण नहीं मिल रहा है जो कि मैं जो करने की कोशिश कर रहा हूं जैसा दिखता है।रिश्ते के माध्यम से कोर डेटा प्रश्न कैसे करें?

मान लें कि मैं एक डीवीडी डेटाबेस के साथ खेल रहा हूं। मेरे पास दो संस्थाएं हैं। एक मूवी (शीर्षक, वर्ष, रेटिंग, और अभिनेता के साथ संबंध) और अभिनेता (नाम, लिंग, चित्र)।

सभी फिल्में प्राप्त करना आसान है। यह सिर्फ है:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Winery" 
inManagedObjectContext:self.managedObjectContext]; 

"मार" में शीर्षक आसान है के साथ सभी फिल्में हो रही है, मैं सिर्फ एक NSPredicate जोड़ें:

NSPredicate *predicate = [NSPredicate predicateWithFormat: 
@"name LIKE[c] "*\"Kill\"*""]; 

लेकिन कोर डाटा प्रबंधित के लिए बाहर सार आईडी क्षेत्रों के लिए लगता है ऑब्जेक्ट्स ... तो मैं किसी ऑब्जेक्ट के विरुद्ध क्वेरी कैसे करूं (या: रिश्ते के खिलाफ क्वेरी)?

दूसरे शब्दों में, यह मानते हुए कि मेरे पास पहले से ही अभिनेता ऑब्जेक्ट है (उदाहरण के लिए ऑब्जेक्ट आईडी 1 - 'चक नॉरिस']), "मुझे ऑब्जेक्ट आईडी अभिनीत करने वाली सभी फिल्में दें" के लिए पूर्वानुमान प्रारूप क्या है 1 - 'चक नॉरिस'] "?

उत्तर

6

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

// Obviously you should do proper error checking here... but for this example 
// we'll assume that everything actually exists in the database and returns 
// exactly what we expect. 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Actor" inManagedObjectContext:self.managedObjectContext]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE[c] 'Chuck Norris'"]; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:entity]; 
[request setPredicate:predicate]; 

// You need to have imported the interface for your actor entity somewhere 
// before here... 
NSError *error = nil; 
YourActorObject *chuck = (YourActorObject*) [[self.managedObjectContext executeFetchRequest:request error:&error] objectAtIndex:0]; 

// Now just get the set as defined on your actor entity... 
NSSet *moviesWithChuck = chuck.movies; 

एक नोट के रूप में, इस उदाहरण स्पष्ट रूप से मान लिया गया 10.5 गुणों का उपयोग करते हैं, लेकिन आप एक्सेसर तरीकों का उपयोग कर 10.4 में एक ही बात कर सकते हैं।

5

या आप एक और विधेय का उपयोग कर सकते हैं:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Actor" inManagedObjectContext:self.managedObjectContext]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@",@"Chuck Norris"] 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:entity]; 
[request setPredicate:predicate]; 

YourActorObject *chuck = [[self.managedObjectContext executeFetchRequest:request error:nil] objectAtIndex:0]; 
[request release]; 

NSSet *moviesWithChuck = chuck.movies; 
संबंधित मुद्दे