2010-09-27 18 views
6

मुझे पता है कि कोर डेटा डेटाबेस नहीं है और इसमें कई अंतर हैं। क्या यह वाला है?कोर डेटा: 3 टेबल में शामिल हों?

एक डेटाबेस में, मैं आमतौर पर निम्नलिखित है |

एक - >> बी - >> सी

'ए' कई 'बी' जो कई 'सी'

है है क्वेरी, "मुझे दो सब एक के जो = 'एक्स' c.attr है आसानी से की तरह लिखा है:

select * from a, b, c where a.id = b.aid and b.id = c.bid and c.attr = 'X' 

कोर डाटा में, मैं भी ऐसा ही चाहते हैं, लेकिन जैसे एक विधेय का उपयोग कर:

NSPredicate *predicate = 
    [NSPredicate predicateWithFormat:@"ANY bs.cs.attr = %@", "X"]; 
[frequest setEntity:entityA]; 
[frequest setPredicate:predicate]; 

ऐसा करने से त्रुटि में परिणाम है: 'NSInvalidArgumentException', कारण: 'कई करने वाली कई चाबियाँ यहाँ की अनुमति नहीं'

हूँ मेरा मतलब है के लिए एक सीमा डेटाबेस बहु फोन पर क्या है की व्याख्या करने को सही -टेबल जुड़ता है?

मैं चारों ओर गुगल रहा हूं और एक निश्चित उत्तर नहीं मिला।

इस क्वेरी के लिए मेरे वर्तमान समाधान लगता है:

NSPredicate *predicate = 
    [NSPredicate predicateWithFormat:@"ANY cs.attr = %@", "X"]; 
... 
NSArray *bs = //execute fetch 
for (B *b in bs) { 
    //add b.a into an array 
} 
//return array 

वहाँ एक बेहतर तरीका है? विचार के लिए अग्रिम धन्यवाद।

+0

यूघ, ए, बी, सी वाक्यविन्यास में शामिल होना बुरा है। –

उत्तर

8

आप इस पीछे के बारे में जा रहे हैं।

सबसे पहले, आपको कोर डेटा में लिंकिंग आईडी की आवश्यकता नहीं है क्योंकि सभी संबंधित ऑब्जेक्ट्स पहले ही रिश्ते से जुड़े हुए हैं। इसका मतलब है कि where a.id = b.aid and b.id = c.bid जैसे निर्माण की आवश्यकता नहीं है।

दूसरा, आप आमतौर पर उस इकाई के लिए fetch इकाई सेट करते हैं जो परिभाषित परीक्षण प्राप्त करता है।

NSPredicate *p=[NSPredicate predicateWithFormat:@"attr=%@",xValue]; 

यह एक सरणी वापस आ जाएगी सभी C उदाहरणों कि परीक्षण को पूरा: इस मामले में, कि c.attr="X" तो, आप C करने के लिए अपने लाने इकाई स्थापित करने और अपने विधेय कुछ ऐसा दिखाई देगा है। फिर किसी भी विशेष B या A को ढूंढना सिर्फ C के लिए संबंध चलने का मामला है।

अपने व्युत्क्रम संबंध टू-वन जैसे है एक < - >> बी < - >> सी, तो आप सिर्फ b.a तो के मूल्य के लिए प्रत्येक C से पूछते हैं:

AObject *anA = aCinstance.b.a; 

यह महत्वपूर्ण है याद करने के लिए आप यहां टेबल से निपट नहीं रहे हैं। आप ऑब्जेक्ट ग्राफ़ से निपट रहे हैं। आप एक विशेष इकाई को लाने के लिए सेट करते हैं और फिर फ़िल्टर की गई संस्थाओं के रिश्तों को चलाते हैं।

+0

इससे मदद मिलती है। धन्यवाद! – Mike

1

क्या कोर डेटा दोनों बी और ए के गुणों के लिए परीक्षण जोड़ने के लिए संभव है? या क्या मुझे अपना अंतिम परिणाम प्राप्त करने के लिए क्रमशः प्रत्येक परिणाम सेट पर फिर से शुरू करना होगा?

select 
    p.id, p.total 
from 
    purcord p, line l, delivery d 
where 
    l.purcord_id = p.id 
    and d.purcord_id = l.purcord_id 
    and d.purcord_line_no = l.line_no 
    and d.status = 'notdelivered' 
    and l.status = 'open' 
    and p.status = 'open' 
संबंधित मुद्दे