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
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];
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;
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.
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
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).
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");
}
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
}
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
}
- 1. Core Data: Holen Sie alle Entitäten
- 2. XCode: Abstrakte Entitäten aus dem Core Data-Diagramm ausschließen
- 3. Core Data Entitäten holen mit nur eindeutige Attribute
- 4. Erstellen einer Core Data Inverse-Beziehung
- 5. NSDictionary und Core Data
- 6. Effiziente Prüfung möglicher doppelter Entitäten
- 7. Core Data synchronisierbar & com.apple.syncservices.Syncable
- 8. Kann nicht Attribut für Entitäten in Core Data Set
- 9. Beziehungsfehler in Core Data
- 10. Core Data EXC_BAD_ACCESS
- 11. Core Data Relationship Fault
- 12. Generic Core Data "Attachable" Elternklasse
- 13. Aktualisierte Core Data Concurrency-Dokumentation?
- 14. Core Data & Generating Model Entities
- 15. Implementieren von Parent-> Child-Drilldown in Cocoa mit Core Data-Bindungen, die sich über mehrere Entitäten erstrecken
- 16. Cocoa Touch: Wann wird ein NSFetchedResultsController erforderlich, um einen Core Data-Abruf zu verwalten?
- 17. Beschleunigen Core Data holen
- 18. Probleme mit Core Data Daten
- 19. Schnellste Möglichkeit, Linq zu Entitäten zu lernen
- 20. Effiziente Out-Of-Core-Sortierung
- 21. Gibt es ein Java-Äquivalent zu Apple Core Data?
- 22. Core Data fügen Beziehung Wert
- 23. Was ist der Typ für boolesche Attribute in Core Data-Entitäten?
- 24. UITableView Core Data Nachbestellung
- 25. Fallen, um aktuellen Benutzer in Core Data zu speichern
- 26. Core Data Fault
- 27. Core Data und Multithreading
- 28. Sicherung .sqlite (Core Data)
- 29. Core Data Entity umbenennen
- 30. Core Data mit JSON
Auf Leopard möchten Sie countForFetchRequest verwenden: und nicht executeFetchRequest: – IlDan
Ja! Vielen Dank. Ich werde den Code aktualisieren. –
Und überspringen, um das Prädikat zu setzen. Kein Vergleichselement: Alle Objekte abrufen, die der Entitätsbeschreibung entsprechen – IlDan