可可核心数据有效的方法来统计实体
问题描述:
我读了很多关于核心数据..但什么是一个有效的方式来计数实体类型(如SQL可以做SELECT计数(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;
答
我只补充一点,以使其更加有效......因为它只是一个数,你并不真正需要的任何属性值,当然喜欢的一个上面的代码示例也不需要子实体。
所以,代码应该是这样的:
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
答
斯威夫特
这是相当容易获得核心数据实体的实例总数的计数:
let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
let fetchRequest = NSFetchRequest(entityName: "MyEntity")
let count = context.countForFetchRequest(fetchRequest, error: nil)
我在模拟器与400,000测试这对象数量和结果相当快(虽然不是即时的)。
答
如果你想找到计数特定前提取,我相信这是最好的办法:
NSError *err;
NSUInteger count = [context countForFetchRequest:fetch error:&err];
if(count > 0) {
NSLog(@"EXIST");
} else {
NSLog(@"NOT exist");
}
答
我写了斯威夫特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
}
豹要使用countForFetchRequest:不executeFetchRequest: – IlDan 2009-07-15 23:49:55
是的!谢谢。我会更新代码。 – 2009-07-16 00:23:23
然后跳过设置谓词。没有谓词:获得与实体描述匹配的所有对象 – IlDan 2009-07-16 00:42:46