2009-07-15 8 views
161

मैं कोर डेटा के बारे में बहुत कुछ पढ़ता हूं .. लेकिन एक इकाई-प्रकार पर गिनती करने का एक प्रभावी तरीका क्या है (जैसे एसक्यूएल चयन गणना (1) ... के साथ कर सकता है।)। अब मैंने NSFetchedResultsController के साथ सभी को चुनने और NSArray की गिनती के साथ इस कार्य को हल किया है! मुझे यकीन है कि यह सबसे अच्छा तरीका नहीं है ...कोको कोर डेटा इकाइयों को गिनने का प्रभावी तरीका

उत्तर

285

मुझे नहीं पता कि NSFetchedResultsController का उपयोग करना आपके लक्ष्य को पूरा करने का सबसे प्रभावी तरीका है (लेकिन यह हो सकता है)। स्पष्ट कोड इकाई उदाहरणों की गिनती प्राप्त करने के लिए नीचे है:

// assuming NSManagedObjectContext *moc 

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:moc]]; 

[request setIncludesSubentities:NO]; //Omit subentities. Default is YES (i.e. include subentities) 

NSError *err; 
NSUInteger count = [moc countForFetchRequest:request error:&err]; 
if(count == NSNotFound) { 
    //Handle error 
} 

[request release]; 
+1

तेंदुए पर में आप countForFetchRequest उपयोग करना चाहते हैं: और नहीं executeFetchRequest: – IlDan

+0

हाँ! धन्यवाद। मैं कोड अपडेट करूंगा। –

+0

और भविष्यवाणी सेट करने के लिए छोड़ दें। कोई अनुमान नहीं: सभी विवरण प्राप्त करें जो इकाई विवरण से मेल खाते हैं – IlDan

54

, आप इकाइयों की गणना नहीं कर रहे हैं स्पष्ट है, लेकिन किसी विशेष इकाई के उदाहरण। (सचमुच इकाइयों की गिनती करने के लिए, प्रबंधित इकाइयों को अपनी इकाइयों की गिनती के लिए पूछें।)

सभी डेटा लाने के बिना किसी दिए गए इकाई के सभी उदाहरणों को गिनने के लिए, -countForFetchRequest: का उपयोग करें।

उदाहरण के लिए:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity: [NSEntityDescription entityForName: entityName inManagedObjectContext: context]]; 

NSError *error = nil; 
NSUInteger count = [context countForFetchRequest: request error: &error]; 

[request release]; 

return count; 
21

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

तो, कोड इस तरह होना चाहिए:

int entityCount = 0; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"YourEntity" inManagedObjectContext:_managedObjectContext]; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:entity]; 
[fetchRequest setIncludesPropertyValues:NO]; 
[fetchRequest setIncludesSubentities:NO]; 
NSError *error = nil; 
NSUInteger count = [_managedObjectContext countForFetchRequest: fetchRequest error: &error]; 
if(error == nil){ 
    entityCount = count; 
} 

आशा है कि यह मदद करता है।

9

मुझे विश्वास है कि ऑब्जेक्ट्स गिनने का सबसे आसान और सबसे प्रभावी तरीका NSFetchRequest परिणाम NSCountResultType पर सेट करना है और इसे NSManagedObjectContext countForFetchRequest:error: विधि से निष्पादित करना है।

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:entityName]; 
fetchRequest.resultType = NSCountResultType; 
NSError *fetchError = nil; 
NSUInteger itemsCount = [managedObjectContext countForFetchRequest:fetchRequest error:&fetchError]; 
if (itemsCount == NSNotFound) { 
    NSLog(@"Fetch error: %@", fetchError); 
} 

// use itemsCount 
20

स्विफ्ट

यह कोर डाटा में एक इकाई के उदाहरणों की कुल संख्या की गिनती प्राप्त करने के लिए काफी आसान है:

let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 
let fetchRequest = NSFetchRequest(entityName: "MyEntity") 
let count = context.countForFetchRequest(fetchRequest, error: nil) 

मैं एक 400,000+ साथ सिम्युलेटर में यह परीक्षण किया ऑब्जेक्ट गिनती और परिणाम काफी तेज़ था (हालांकि तात्कालिक नहीं)।

0

आप predicated विशिष्ट के लिए गिनती पता लगाना चाहते हैं लाने, मैं विश्वास है कि यह सबसे अच्छा तरीका है:

NSError *err; 
NSUInteger count = [context countForFetchRequest:fetch error:&err]; 

if(count > 0) { 
NSLog(@"EXIST"); 
} else { 
NSLog(@"NOT exist"); 
} 
3

मैं स्विफ्ट 3 के लिए एक सरल उपयोगिता विधि लिखा वस्तुओं की गिनती लाने के लिए।

static func fetchCountFor(entityName: String, predicate: NSPredicate, onMoc moc: NSManagedObjectContext) -> Int { 

    var count: Int = 0 

    moc.performAndWait { 

     let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: entityName) 
     fetchRequest.predicate = predicate 
     fetchRequest.resultType = NSFetchRequestResultType.countResultType 

     do { 
      count = try moc.count(for: fetchRequest) 
     } catch { 
      //Assert or handle exception gracefully 
     } 

    } 

    return count 
} 
1

स्विफ्ट 3

static func getProductCount() -> Int { 
    let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Product") 
    let count = try! moc.count(for: fetchRequest) 
    return count 
} 
संबंधित मुद्दे