2009-07-15 109 views
161

我读了很多关于核心数据..但什么是一个有效的方式来计数实体类型(如SQL可以做SELECT计数(1)...)。现在我只需要用NSFetchedResultsControllerNSArray的计数来​​解决这个任务!我相信这不是最好的方法...可可核心数据有效的方法来统计实体

回答

285

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

豹要使用countForFetchRequest:不executeFetchRequest: – IlDan 2009-07-15 23:49:55

+0

是的!谢谢。我会更新代码。 – 2009-07-16 00:23:23

+0

然后跳过设置谓词。没有谓词:获得与实体描述匹配的所有对象 – IlDan 2009-07-16 00:42:46

54

要清楚的是,您不计算实体,而是计算特定实体的实例。 (要实际计数实体,请向被管对象模型计算其实体的数量。)

要计算给定实体的所有实例而不提取所有数据,请使用-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; 
21

我只补充一点,以使其更加有效......因为它只是一个数,你并不真正需要的任何属性值,当然喜欢的一个上面的代码示例也不需要子实体。

所以,代码应该是这样的:

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

希望它能帮助。

9

我相信最简单和最有效的计算对象的方法是将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 
20

斯威夫特

这是相当容易获得核心数据实体的实例总数的计数:

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

我在模拟器与400,000测试这对象数量和结果相当快(虽然不是即时的)。

0

如果你想找到计数特定前提取,我相信这是最好的办法:

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

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

我写了斯威夫特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 
} 
1

在斯威夫特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 
}