2012-12-06 15 views
5

मुझे अपने कोर डेटा स्टोरेज से दो टेबल/मॉडल पर "शामिल" -टाइप ऑपरेशन करने की आवश्यकता है, और मुझे कुछ प्राप्त करने के लिए अच्छे उदाहरण खोजने में मुश्किल हो रही है काम करने के लिए इस तरह।कोर डेटा - सरल जॉइन-प्रकार प्राप्त करें

यह काफी सरल है जो मुझे करने की ज़रूरत है। मेरे पास दो मॉडल/टेबल हैं: स्थान और location_categories, जहां स्थानों में स्थान/प्रतिष्ठान का विवरण होता है (एक अद्वितीय आईडी के साथ), और location_categories तालिका में category_id के संबंधित location_id के साथ होता है। मुझे उन सभी स्थानों का चयन करने की आवश्यकता है, जहां एक श्रेणी_आईडी दी गई है, यह दो टेबल/मॉडल में शामिल हो जाती है। यदि यह सीधे एसक्यूएल था, यह इस प्रकार दिखाई देगा (और इस क्वेरी काम करता है जब मैं यह वास्तविक SQLite DB के खिलाफ चलाए):

// pretend we passed in a catID of 29: 
SELECT * FROM zlocation where zlocid in (select zlocid from zloccategory where zcatid = 29) 

तो जैसा कि आप देख सकते हैं, यह बहुत सीधी-सपाट है। क्या दो fetches और फॉर-लूप करने के बिना ऐसा करने का कोई तरीका है? ऐसा करने के लिए मेरा वर्तमान उद्देश्य-सी कोड नीचे है, और यह ठीक काम करता है, लेकिन निश्चित रूप से यह बहुत धीमी और अक्षम है, दोनों टेबलों में बहुत सारे डेटा होने के कारण। के लिए-छोरों एक बड़ी मंदी का कारण बन रहे हैं, और मेरे पेट मुझसे कहता है कि यह काम वास्तव में चीजों की DB/कोर-डाटा पक्ष पर किया जाना चाहिए:

- (NSMutableArray *) fetchLocsWithCatID:(NSString *)catID { 
    NSMutableArray *retArr = [[NSMutableArray alloc] init]; 

    NSManagedObjectContext *context = [self managedObjectContext]; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    [fetchRequest setEntity:[NSEntityDescription entityForName:MODELNAME_LOCCATEGORIES inManagedObjectContext:context]]; 
    [fetchRequest setPredicate: [NSPredicate predicateWithFormat:@"catID == %@", catID]]; 

    NSError *error; 
    NSArray *locCats = [context executeFetchRequest:fetchRequest error:&error]; 
    NSArray *allLocsArr = [self fetchAllDataForTable:MODELNAME_LOCATION]; // this retrieves contents of entire table 

    for (Location *currLoc in allLocsArr) { 
     for (LocCategory *currLocCat in locCats) { 
      if ([currLoc.locID isEqualToString:currLocCat.locID]) { 
       if (![retArr containsObject:currLoc]) { 
        [retArr addObject:currLoc]; 
       } 
      } 
     } 
    } 

    return retArr; 
} 

है कि क्या यह एक एकल के साथ संभव है पर कोई विचार विधेय/लाने? या डुनो .. शायद उद्देश्य-सी कोड के माध्यम से उन दो एनएसएआरआरए में शामिल होने का एक और अधिक प्रभावी तरीका है?

इस पर किसी भी दिशा के लिए अग्रिम धन्यवाद!

उत्तर

3

संबंधों का उपयोग करने का सबसे अच्छा तरीका होगा।

इस तरह से जब आप एक Location लाने आप भी LocationCategorymyLocation.locationCategory तरह

तुम इतनी तरह अपने relationsship स्थापित करने के लिए की आवश्यकता होगी पहुँच सकते हैं: एक से-अनेक संबंध

(Entity)LocationCategory.(relationship)locations <->> (Entity)Location.(relationship)locationCategory 

यह है। उलटा या तो मत भूलना।

एक बार यह स्थापित हो जाने के बाद आपको केवल संबंधों को जोड़ने की आवश्यकता है जहां आप कभी भी इकाई उदाहरण बनाते हैं। पसंद:

Location *myLocation = ... 
LocationCategory *myLocationCategory = ... 
myLocation.locationCategoy = myLocationCategory; 

यह भी सुनिश्चित करें कि आप वस्तुओं को लाने के लिए एक ही एमओसी का उपयोग कर रहे हैं।ऑब्जेक्ट बनाने और निर्दिष्ट moc में लाने के लिए मैं दृढ़ता से MagicalRecord की अनुशंसा करता हूं।

+0

इसे सर्वोत्तम उत्तर के रूप में चिह्नित करना, क्योंकि आपने संबंधों को जोड़ने की आवश्यकता के बारे में भी उल्लेख किया है। मॉडल में रिश्तों को लागू करने के बाद भी, यह कुछ ऐसा था जो मुझे अभी भी स्टंप कर चुका था। धन्यवाद! – svguerin3

2

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

आप इसे कोर डेटा मॉडलिंग स्क्रीन में कर सकते हैं।

एक बार ऐसा करने के बाद, स्थान प्रबंधित ऑब्जेक्ट क्लास में स्थान श्रेणियों का एनएसएससेट होगा। इसी प्रकार, स्थान श्रेणियों की इकाई में स्थान की एक वस्तु होगी।

तो आपको बस इतना करना होगा कि आप कैसे करते हैं जैसे स्थान श्रेणियों की एक क्वेरी है। लेकिन अतिरिक्त प्रश्नों के बजाय आपको

for (LocationCategory *locationCategory in locationCats) { 
    NSLog(@"Location name is %@",locationCategory.location.locationName); 
    // You can ofcourse add it to an arrary or what ever 
} 

कोई भी कोर डेटा ट्यूटोरियल इस पर आपकी सहायता करने में सक्षम होना चाहिए।

+0

शानदार, धन्यवाद! मैं अपने मॉडल में रिश्तों का उपयोग करने से बचने के लिए बेवकूफ़ महसूस करता हूं .. मैंने सोचा कि बहुत अधिक बिंदु नहीं था, लेकिन अब मैं बिंदु देखता हूं। :) मुझे नहीं पता था कि इस तरह से संबंधों का उपयोग किया जा सकता है (मैं कोर डेटा के लिए बिल्कुल नया हूं)। यह अभी ठीक काम कर रहा है। आपकी मदद और समय के लिए फिर से धन्यवाद! – svguerin3

1

यदि इन इकाइयों को कोरडाटा में मॉडलिंग किया गया था, तो आमतौर पर स्थान से लेकर स्थान_श्रेष्ठियों के विपरीत संबंधों के साथ, आप location_categories से स्थानों पर एक सहयोग प्राप्त करेंगे। तो अगर मेरे पास "स्थान" नामक एक इकाई थी, तो इसका नाम स्थान श्रेणी का नाम होगा, और स्थान श्रेणी इकाई में इसका स्थान कहा जाता है।

द्वि-दिशात्मक संबंध उस तरह परिभाषित के साथ

, मैं तो कुछ इस तरह अनुरोध लाने का उपयोग कर मेरी सेट अप करना होगा:

[fetchRequest setEntity:[NSEntityDescription entityForName:MODELNAME_LOCATIONS inManagedObjectContext:context]]; 
[fetchRequest setPredicate: [NSPredicate predicateWithFormat:@"locationCategory.catID == %@", catID]]; 

बस इतना ही स्थान वस्तुओं है कि किसी भी के साथ एक स्थान श्रेणी के साथ जुड़े रहे लौटना चाहिए श्रेणी आईडी

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