objective-c - data教學 - executefetchrequest objective c




可可核心數據有效的方法來統計實體 (6)

迅速

核心數據中實體的實例總數很容易計算:

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

我在模擬器中測試了400,000個對像數,結果相當快(儘管不是瞬時的)。

我讀了很多關於核心數據的內容......但是對一個實體類型進行計數的有效方式是什麼(比如SQL可以用SELECT count(1)...)。 現在我解決了這個任務,選擇所有NSFetchedResultsController並獲取NSArray的數量! 我相信這不是最好的方法...


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

我不知道使用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];

我只是補充一點,使它更有效率......因為它只是一個計數,你並不需要任何屬性值,當然也可以像上面的代碼示例之一那樣,你不需要子實體。

所以,代碼應該是這樣的:

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

要清楚的是,你不計算實體,而是計算特定實體的實例。 (為了實際計數實體,請向託管對像模型請求其實體的計數。)

要計算給定實體的所有實例而不提取所有數據,請使用-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;




core-data