Programming

엔티티를 계산하는 코코아 코어 데이터 효율적인 방법

procodes 2020. 5. 25. 22:31
반응형

엔티티를 계산하는 코코아 코어 데이터 효율적인 방법


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
}

특정 술어 페치의 수를 찾으려면 이것이 최선의 방법이라고 생각합니다.

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

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

참고URL : https://stackoverflow.com/questions/1134289/cocoa-core-data-efficient-way-to-count-entities

반응형