2013-02-11 25 views
5

कोर डेटा का उपयोग करके, मुझे एक समस्या आई। मेरे पास एक विशेषता "राशि" के साथ एक इकाई "आंदोलन" है। मैं सभी मामलों की सभी "राशि" का योग कैसे बना सकता हूं? मैं समझना चाहता हूं कि NSExpressionDescription का उपयोग कैसे करें, लेकिन यह पर्याप्त NSSet है।सभी डेटा गुणों का कोर डेटा योग

उत्तर

20

एक managedObjectContext होने: फिर

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Movement class])]; 
fetchRequest.resultType = NSDictionaryResultType; 

हम योग की गणना करने के लिए एक अभिव्यक्ति वर्णन बनाने:

NSManagedObjectContext *managedObjectContext = ... 

हम वापसी प्रकार शब्दकोश के साथ एक लाने का अनुरोध बनाने

NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init]; 
expressionDescription.name = @"sumOfAmounts"; 
expressionDescription.expression = [NSExpression expressionForKeyPath:@"@sum.amount"]; 
expressionDescription.expressionResultType = NSDecimalAttributeType; 

अनुरोध गुणों को लाने के लिए सेट करें:

fetchRequest.propertiesToFetch = @[expressionDescription]; 

यदि हम चाहते हैं तो हम भविष्यवाणी भी कर सकते हैं।

और आखिरकार हम अनुरोध को निष्पादित करते हैं और एक कुंजी (@ "sumOfAmounts") के साथ एक शब्दकोश युक्त सरणी प्राप्त करते हैं और इसका मान राशि के साथ एनएसएनंबर है।

NSError *error = nil; 
NSArray *result = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
if (result == nil) 
{ 
    NSLog(@"Error: %@", error); 
} 
else 
{ 
    NSNumber *sumOfAmounts = [[result objectAtIndex:0] objectForKey:@"sumOfAmounts"]; 
} 

चीयर्स

+1

क्यों downvote? – e1985

+0

क्षमा करें, यह मेरा बुरा है, मैं ऊपर उठाना चाहता था ... कृपया अपनी पोस्ट पर थोड़ा संपादन प्रदान करें ताकि मैं अपना वोट – Yaman

+0

धन्यवाद आदमी को बदल सकूं! अच्छा काम करता है! – Vins

2

का सबसे अच्छा तरीका एक fetch for specific values का उपयोग करें और जब आप लाने आप एक शब्दकोश जिसका कुंजी अभिव्यक्ति विवरण और जिनके मान भाव के परिणाम हैं से मेल युक्त एक तत्व सरणी मिल निष्पादित एक NSExpressionDescription with a sum: function.

आपूर्ति है। इस मामले में, आपको sum कुंजी मिलेगी जिसका मूल्य अभिव्यक्ति के गुणों का योग होगा।

1

यहाँ एक प्रबंधित वस्तु के गुण संक्षेप NSExpression और NSExpressionDescription उपयोग करने का एक स्विफ्ट उदाहरण है। उदाहरण मानता है कि प्रबंधित ऑब्जेक्ट का नाम Movement और योग की विशेषता amount है।

उदाहरण:

func sumAmount -> Double { 

    var amountTotal : Double = 0 

    // Step 1: 
    // - Create the summing expression on the amount attribute. 
    // - Name the expression result as 'amountTotal'. 
    // - Assign the expression result data type as a Double. 

    let expression = NSExpressionDescription() 
    expression.expression = NSExpression(forFunction: "sum:", arguments:[NSExpression(forKeyPath: "amount")]) 
    expression.name = "amountTotal"; 
    expression.expressionResultType = NSAttributeType.DoubleAttributeType 

    // Step 2: 
    // - Create the fetch request for the Movement entity. 
    // - Indicate that the fetched properties are those that were 
    // described in `expression`. 
    // - Indicate that the result type is a dictionary. 

    let fetchRequest = NSFetchRequest(entityName: "Movement") 
    fetchRequest.propertiesToFetch = [expression] 
    fetchRequest.resultType = NSAttributeType.DictionaryResultType 

    // Step 3: 
    // - Execute the fetch request which returns an array. 
    // - There will only be one result. Get the first array 
    // element and assign to 'resultMap'. 
    // - The summed amount value is in the dictionary as 
    // 'amountTotal'. This will be summed value. 

    do { 
     let results = try context.executeFetchRequest(fetchRequest) 
     let resultMap = results[0] as! [String:Double] 
     amountTotal = resultMap["amountTotal"]! 
    } catch let error as NSError { 
     NSLog("Error when summing amounts: \(error.localizedDescription)") 
    } 

    return amountTotal 
} 

कदम के अतिरिक्त चर्चा:

चरण 1 - एक NSExpressionDescription चर बनाएँ। यह NSExpressionDescription इंगित करता है कि तर्कों के लिए किस प्रकार का फ़ंक्शन लागू किया जाता है। योग फ़ंक्शन राशि विशेषता पर लागू किया जा रहा है।

expression.expression = NSExpression(forFunction: "sum:", 
    arguments:[NSExpression(forKeyPath: "amount")]) 

सूचना है कि तर्क पैरामीटर एक सरणी है। आप सरणी में विभिन्न प्रकार के अभिव्यक्तियों को पारित कर सकते हैं, लेकिन, हमारे मामले में हम केवल amount विशेषता चाहते हैं।

चरण 2 - यहां प्राप्त करने का अनुरोध यहां स्थापित किया गया है। ध्यान दें कि परिणाम प्रकार को एक शब्दकोश के रूप में निर्दिष्ट किया गया है: fetchRequest.resultType = NSAttributeType.DictionaryResultType। चरण 3 में हम amountTotal के मूल्य का उपयोग सारांशित मूल्य तक पहुंचने के लिए कुंजी के रूप में करेंगे।

चरण 3 - हम fetch अनुरोध निष्पादित करते हैं और लौटाए गए एक तत्व सरणी होगी। तत्व एक शब्दकोश होगा जिसे हम [String:Double] पर जा सकते हैं: let resultMap = results[0] as! [String:Double]। शब्दकोश का मान एक डबल है क्योंकि चरण 1 में हमने संकेत दिया कि expression.expressionResultType एक डबल होगा।

अंत में, हम amountTotal कुंजी से संबद्ध शब्दकोश मूल्य को फोन करके राशि का उपयोग: resultMap["amountTotal"]!


संदर्भ:

NSExpression और NSExpressionDescription