Cocoa Основные данные Эффективный способ подсчета объектов

Я много читаю о Core Data.. но эффективный способ сделать подсчет над Entity-Type (например, SQL может делать с SELECT count (1)...). Теперь я решил эту задачу, выбрав все NSFetchedResultsController и получив счет NSArray! Я уверен, что это не лучший способ...

Ответ 1

Я не знаю, является ли использование 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];

Ответ 2

Чтобы быть ясным, вы не считаете объекты, а экземпляры определенного объекта. (Чтобы буквально подсчитать сущности, спросите модель управляемых объектов для подсчета ее сущностей.)

Чтобы подсчитать все экземпляры данного объекта без извлечения всех данных, используйте -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;

Ответ 3

Я просто добавлю это, чтобы сделать его еще более эффективным... и потому что его просто счет, вам действительно не нужно какое-либо значение свойства и, конечно, как один из примеров кода выше, вам не нужны суб- объекты.

Итак, код должен выглядеть следующим образом:

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

Надеюсь, что это поможет.

Ответ 4

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+, и результат был довольно быстрым (хотя и не мгновенным).

Ответ 5

Я считаю, что самый простой и эффективный способ подсчета объектов - установить тип результата 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

Ответ 6

Я написал простой способ утилиты для 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
}

Ответ 7

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

Ответ 8

Если вы хотите найти счетчик для конкретной исходной выборки, я считаю, что это лучший способ:

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

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