2011-01-20 14 views
5

के साथ सहायता मैं कोरडाटा में कुछ बुनियादी प्रश्न लिखने के तरीकों की तलाश में हूं और दस्तावेज़ीकरण में उदाहरण नहीं हैं। निम्नलिखित मेरी क्वेरी है:कोरडाटा क्वेरी

  1. मेरे पास एक व्यय वस्तु है और इसमें एक व्यय फ़ील्ड है।
  2. व्यय को ExpenseCategory ऑब्जेक्ट से जोड़ा जा सकता है।
  3. व्यय श्रेणी केवल व्यय के लिए श्रेणी को परिभाषित कर सकती है (उदाहरण के लिए भोजन) या इसमें इकाई दर हो सकती है (उदाहरण के लिए माइलेज)। यदि यह सिर्फ नाम है, तो व्यय मूल्य व्यय वस्तु में व्यय है, अन्यथा यह व्यय है * एक्सपेंस श्रेणी में यूनिटरेट।
  4. चूंकि श्रेणी लिंक का व्यय वैकल्पिक है, अंतिम व्यय श्रेणी और इकाई दर की उपस्थिति/अनुपस्थिति पर आधारित होगा।

तो कुल खर्च की गणना करने के लिए एक SQL क्वेरी होगा:

select 
    TOTAL(e.amount * IFNULL(c.rate, 1)) 
from EXPENSE e 
LEFT OUTER join CATEGORY c on 
    e.category = c.id 

यह कैसे CoreData में किया जा सकता?

+0

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

उत्तर

2

एक आसान समाधान आपके व्यय वर्ग पर एक और विधि लागू करने के लिए हो सकता है जो आपको उचित गणना की गई राशि देता है।

उदा।

- (NSDecimalNumber *) calculatedExpenseAmount { 

    NSDecimalNumber *actualAmount = self.expenseAmount; 

    // Pseudo-code begins 
    if (self.expenseCategory != nil) { 
    actualAmount = self.expenseAmount * self.expenseCategory.unitRate; 
    } 

    return actualAmount; 
} 

मैं अपने पिछले जवाब देने के लिए पर जोड़ रहा।

यदि आप प्रत्येक प्रबंधित ऑब्जेक्ट में खींचने से बचना चाहते हैं, तो आप खर्च को निकालने के लिए NSDictionary-result क्वेरी का उपयोग कर सकते हैं .उंट और व्यय Category.unitRate मान।

- (NSDecimalNumber *) totalExpenses 
{ 
    // Fetch all of the expense amounts and unit rate of any related category. 

    NSFetchRequest *request = ...; 
    [request setManagedObjectContext:<...>]; 
    [request setEntity:<ExpenseAccountDescription>]; 
    [request setResultType:NSDictionaryResultType]; 
    NSArray *props = [NSArray arrayWithObjects:@"expenseAmount", @"category.unitRate", nil]; 
    [request setPropertiesToFetch:props]; 

    NSArray *amounts = [request executeRequest:...]; 
    // amounts is an array of dictionaries, each hold the desired property values. 

    // Loop and sum the individual amounts 

    NSDecimal *total = [[NSDecimalNumber zero] decimalNumber]; 
    NSAutoreleasePool *pool = nil; // contain the mess 

    NSCalculationError err = NSCalculationNoError; 

    for (NSDictionary *result in amounts) 
    { 
     pool = [NSAutoreleasePool new]; 

     NSDecimal newTotal = [[NSDecimalNumber zero] decimalNumber]; 
     NSDecimalNumber *expenseAmount = [result valueForKeyPath:@"expenseAmount"]; 
     NSDecimalNumber *unitRate = [result valueForKeyPath:@"category.unitRate"]; 

     if (unitRate != nil) { 
      // do the unit rate multiplication and accumulate the result in the total 

      NSDecimal calculated = [[NSDecimalNumber zero] decimalNumber]; 
      err = NSDecimalMultiply (&calculated, [expenseAmount decimalNumber], [unitRate decimalNumber], NSRoundBankers); 
      if (err == NSCalculationNoError) { 
       err = NSDecimalAdd (&newTotal, total, calculated, NSRoundBankers); 
      } 
     } 
     else { 
      // just accumulate the result in the total 

      err = NSDecimalAdd (&newTotal, total, [expenseAmount decimalNumber], NSRoundBankers); 
     } 

     // Keep the new total 
     NSDecimalCopy(&total, newTotal); 

     [pool drain]; 
    } 

    return [NSDecimalNumber decimalNumberWithDecimal:total]; 
} 

यदि आपके पास 10000 व्यय प्रविष्टियां हैं, तो इस fetch और गणना में 1 एमबी से कम रैम लग सकता है। उपकरण मापने में आपका मित्र होगा।

+0

यह एक ही खर्च के लिए काम करेगा। मैं उन्हें डीबी में सभी खर्चों के बारे में याद दिलाने की कोशिश कर रहा हूं। – siasl

+0

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

+0

मुझे यकीन है कि सीडी निष्पादित मनमाने ढंग से SQL बनाने का कोई तरीका नहीं है। यदि आप वास्तव में लगातार हैं, तो आप सीधे SQLite में जाने का प्रयास कर सकते हैं। यह उन सभी चीजों का समर्थन करता है जिन्हें आप करना चाहते हैं। –

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