programing

코코아 핵심 데이터 엔티티를 효율적으로 계산하는 방법

oldcodes 2023. 5. 4. 20:31
반응형

코코아 핵심 데이터 엔티티를 효율적으로 계산하는 방법

핵심 데이터에 대해 많이 읽었습니다.그러나 SQL이 SELECT count(1)로 수행할 수 있는 것처럼 Entity-Type을 계산하는 효율적인 방법은 무엇입니까?이제 이 작업을 모두 선택하여 해결했습니다.NSFetchedResultsController그리고 카운트를 받는 것.NSArray이게 최선의 방법은 아닐 겁니다

NSFetched Results Controller를 사용하는 것이 목표를 달성하는 가장 효율적인 방법인지는 모르겠습니다.엔티티 인스턴스 수를 가져오는 명시적 코드는 다음과 같습니다.

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

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

정말로 이것뿐입니다.

let kBoat = try? yourContainer.viewContext.count(for: NSFetchRequest(entityName: "Boat"))

"보트"는 데이터 모델 화면에서 엔티티의 이름일 뿐입니다.

여기에 이미지 설명 입력

글로벌이란 무엇입니까?yourContainer?

핵심 데이터를 사용하려면 앱의 특정 시점에 한 번만 사용하면 됩니다.

var yourContainer = NSPersistentContainer(name: "stuff")

여기서 "stuff"는 단순히 데이터 모델 파일의 이름입니다.

여기에 이미지 설명 입력

당신은 이것에 대해 간단히 싱글톤을 가지고 있을 것입니다.

import CoreData
public let core = Core.shared
public final class Core {
    static let shared = Core()
    var container: NSPersistentContainer!
    private init() {
        container = NSPersistentContainer(name: "stuff")
        container.loadPersistentStores { storeDescription, error in
            if let error = error { print("Error loading... \(error)") }
        }
    }
    
    func saveContext() {
        if container.viewContext.hasChanges {
            do { try container.viewContext.save()
            } catch { print("Error saving... \(error)") }
        }
    }
}

그래서 앱의 어디에서나

core.container

당신의 컨테이너입니다.

그래서 실제로 어떤 개체의 수를 세는 것은 단지.

let k = try? core.container.viewContext.count(for: NSFetchRequest(entityName: "Boat"))

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

Swift 5 솔루션:

        var viewContext: NSManagedObjectContext!
        do {
            let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "insertName")
            let count = try viewContext.count(for: fetchRequest)
            print("Counted \(count) objects")
        }
        catch {
            print("Error")
        }

특정 예측 페치에 대한 카운트를 찾고 싶다면, 이것이 가장 좋은 방법이라고 생각합니다.

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

반응형