web-dev-qa-db-ja.com

エンティティをカウントするCocoa Core Dataの効率的な方法

私はコアデータについて多くのことを読みました。これで、NSFetchedResultsControllerですべてを選択し、NSArrayのカウントを取得して、このタスクを解決しました。これは最善の方法ではないと確信しています...

168
erazorx

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];
297
Barry Wark

明確にするために、エンティティをカウントするのではなく、特定のエンティティのインスタンスをカウントします。 (エンティティを文字通りカウントするには、管理対象オブジェクトモデルにエンティティのカウントを要求します。)

すべてのデータを取得せずに特定のエンティティのすべてのインスタンスをカウントするには、-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;
60
Jim Correia

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以上のオブジェクト数でテストしましたが、結果はかなり高速でした(瞬時ではありませんでした)。

26
Suragch

それをさらに効率的にするために追加します...そしてそれは単なるカウントなので、プロパティ値は本当に必要ありませんし、確かに上記のコード例のようにサブエンティティも必要ありません。

したがって、コードは次のようになります。

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

それが役に立てば幸い。

22
Oscar S.

オブジェクトをカウントする最も簡単で効率的な方法は、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
9
Yuriy Pavlyshak

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

In Swift

  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");
}
0
Umitk