[objective-c] 엔티티를 계산하는 코코아 코어 데이터 효율적인 방법

Core Data에 대해 많이 읽었지만 Entity-Type을 계산하는 효율적인 방법은 무엇입니까 (SQL은 SELECT count (1) …로 수행 할 수 있음). 이제 방금 모두를 선택 NSFetchedResultsController하고 NSArray! 이것이 최선의 방법은 아니라고 확신합니다 …



답변

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;


답변

빠른

핵심 데이터에서 엔터티의 총 인스턴스 수를 얻는 것은 매우 쉽습니다.

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

나는 이것을 400,000 + 개체 수로 시뮬레이터에서 테스트했으며 결과는 상당히 빠르다 (순간은 아니지만).


답변

나는 그것을 더 효율적으로 만들기 위해 그것을 추가 할 것입니다 … 그리고 그 수는 단지 속성 값이 필요하지 않으며 위의 코드 예제 중 하나와 마찬가지로 하위 엔터티도 필요하지 않습니다.

따라서 코드는 다음과 같아야합니다.

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


답변

스위프트 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
}