Я много читал о Core Data .. но эффективный способ сделать подсчет над Entity-Type (например, SQL может делать с SELECT count (1) ...). Теперь я просто решил эту задачу, выбрав все с NSFetchedResultsController
и получив счет NSArray
! Я уверен, что это не лучший способ ...Cocoa Core Data эффективный способ подсчета объектов
ответ
Я не знаю, является ли использование 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];
Чтобы быть ясно, что вы не считая объектов, но экземпляры конкретного объекта. (Чтобы буквально подсчитать сущности, спросите модель управляемых объектов для подсчета ее объектов.)
Чтобы подсчитать все экземпляры данного объекта без получения всех данных, используйте -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;
Я просто добавить, что, чтобы сделать его еще более эффективным ... и потому, что его просто счет, вы действительно не нужно никакого значения свойства и, конечно же, как один из примеры кода выше, вам также не нужны суб-сущности.
Таким образом, код должен быть такой:
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;
}
Надеется, что это помогает.
Я считаю, что самый простой и эффективный способ подсчета объектов - установить 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
Swift
Это довольно легко получить количество от общего количества экземпляров объекта в Core Data:
let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
let fetchRequest = NSFetchRequest(entityName: "MyEntity")
let count = context.countForFetchRequest(fetchRequest, error: nil)
я проверил это в симуляторе с 400,000+ счет объекта, и результат был довольно быстрым (хотя и не мгновенным).
Если вы хотите, чтобы найти рассчитывать на конкретный Предикатной выборку, я считаю, что это лучший способ:
NSError *err;
NSUInteger count = [context countForFetchRequest:fetch error:&err];
if(count > 0) {
NSLog(@"EXIST");
} else {
NSLog(@"NOT exist");
}
Я написал простой метод полезности для Swift 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
}
В 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. NSSortDescriptor самый эффективный способ сортировки объектов Core Data Объекты NSSet
- 2. эффективный способ подсчета связанных объектов - Rails 4
- 3. эффективный способ подсчета вхождения
- 4. Эффективный способ подсчета столбцов
- 5. Где разместить «Core Data Stack» в приложении Cocoa/Cocoa Touch
- 6. Самый эффективный способ подсчета кликов
- 7. Более эффективный способ подсчета пересечений?
- 8. Самый эффективный способ подсчета случаев?
- 9. Cocoa-Touch, Core Data: Как удалить все объекты для объекта?
- 10. Добавление объектов в Core Data
- 11. Ручное объединение объектов Core Data
- 12. Objective-C: эффективный способ подсчета объектов в категориях
- 13. Каков наиболее эффективный способ настройки отношений между тысячами объектов в Core Data?
- 14. Самый эффективный способ проверить, сколько объектов ссылается на отношение ко многим в Core Data?
- 15. Каков наиболее эффективный способ удаления большого количества объектов (10.000+) в Core Data?
- 16. Каков эффективный способ подсчета строк в Pig?
- 17. Cocoa-Touch, Core Data: ошибка компоновщика, символ NSManagedObject не найден
- 18. Core Performance Data: NSPredicate сравнение объектов
- 19. Создание инициализатора для объектов Core Data
- 20. Core Data Sync - Отслеживание удаленных объектов
- 21. Core Data Union Query Equivalent
- 22. Эффективный способ подсчета непрочитанных сообщений в twilio?
- 23. Самый эффективный способ подсчета строк таблицы
- 24. Эффективный способ подсчета `` false` между true`
- 25. Эффективный способ подсчета True и False
- 26. Эффективный способ подсчета расстояния на комбинационном замке
- 27. Эффективный способ подсчета количества страниц для печати?
- 28. Эффективный способ подсчета количества различных чисел
- 29. Эффективный способ подсчета цифр очень больших факториалов
- 30. эффективный способ подсчета пикселей в контуре
На Leopard вы хотите использовать countForFetchRequest: а не executeFetchRequest: – IlDan
Да! Спасибо. Я обновлю код. –
И пропустите, чтобы установить предикат. Нет предиката: получить все объекты, соответствующие описанию сущности – IlDan