2009-07-15 14 views
161

Ich lese viel über Core Data .. aber was ist eine effiziente Möglichkeit, eine Zählung über eine Entity-Type (wie SQL mit SELECT count (1) ...) zu machen. Jetzt habe ich gerade diese Aufgabe gelöst, indem ich alle mit NSFetchedResultsController auswählte und die Zählung der NSArray erhielt! Ich bin sicher, das ist nicht der beste Weg ...Cocoa Core Data effiziente Möglichkeit, Entitäten zu zählen

Antwort

285

Ich weiß nicht, ob die Verwendung von NSFetchedResultsController ist der effizienteste Weg, um Ihr Ziel zu erreichen (aber es kann sein). Der explizite Code die Anzahl der Objektinstanzen zu erhalten, ist unten:

// 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

Auf Leopard möchten Sie countForFetchRequest verwenden: und nicht executeFetchRequest: – IlDan

+0

Ja! Vielen Dank. Ich werde den Code aktualisieren. –

+0

Und überspringen, um das Prädikat zu setzen. Kein Vergleichselement: Alle Objekte abrufen, die der Entitätsbeschreibung entsprechen – IlDan

54

klar zu sein, Sie sind Einrichtungen, die nicht zu zählen, sondern Instanzen einer bestimmten Einheit. (Um die Entitäten im wahrsten Sinne des Wortes zu zählen, fragen Sie das verwaltete Objektmodell nach der Anzahl seiner Entitäten.)

Um alle Instanzen einer bestimmten Entität zu zählen, ohne alle Daten abzurufen, verwenden Sie -countForFetchRequest:.

Zum Beispiel:

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

Ich werde nur hinzufügen, dass, um es effizienter zu machen, auch ... und weil seine nur eine Zählung, Sie brauchen nicht wirklich Werteigenschaft und wie sicher zu In den obigen Codebeispielen benötigen Sie auch keine Untereinheiten.

So sollte der Code wie folgt sein:

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; 
} 

Hoffe, es hilft.

9

Ich glaube, der einfachste und effizienteste Weg, um Objekte zu zählen, ist NSFetchRequest Ergebnistyp auf NSCountResultType und führen Sie es mit NSManagedObjectContext countForFetchRequest:error: Methode.

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

Swift

Es ist ziemlich einfach, eine Zählung der Gesamtzahl der Instanzen eines Unternehmens in Kerndaten zu erhalten:

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

ich dies mit einem 400,000+ im Simulator getestet Objektanzahl und das Ergebnis war ziemlich schnell (wenn auch nicht sofort).

0

Wenn Sie für bestimmte zählen wollen finden sagte holen, ich glaube, dass dies der beste Weg ist:

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

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

ich eine einfache Dienstprogramm Methode für Swift 3 schrieb die Anzahl der Objekte, zu holen.

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

In Swift 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 
}