엔티티를 계산하는 코코아 코어 데이터 효율적인 방법
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
'Programming' 카테고리의 다른 글
Android 에뮬레이터 오류 메시지 : "PANIC : 'x86'CPUS에 대한 에뮬레이터 엔진 프로그램이 없습니다." (0) | 2020.05.25 |
---|---|
JSON을지도로 변환 (0) | 2020.05.25 |
MySQL에서 기본 키 제거 (0) | 2020.05.25 |
리눅스에서 Xcode를 실행할 수 있습니까?SQL Server 문자열을 날짜로 변환 (0) | 2020.05.25 |
C # MVC4 WebAPI 앱에 대해 모든 예외를 전체적으로 어떻게 기록합니까? (0) | 2020.05.25 |