cocoa核心数据有效的方法来统计实体!
我读了很多关于核心数据..但什么是一个有效的方式来计算实体types(如SQL可以做SELECT计数(1)…)。 现在我刚刚解决了这个任务,select所有与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 (ie include subentities) NSError *err; NSUInteger count = [moc countForFetchRequest:request error:&err]; if(count == NSNotFound) { //Handle error } [request release];
要清楚的是,你不是统计实体,而是计算某个实体的实例。 (为了统计实体数量,请向托pipe对象模型请求实体数量。)
要计算给定实体的所有实例而不提取所有数据,请使用-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; }
希望能帮助到你。
迅速
这是Objective-C的一个老问题,但不是为Swift做一个新的问题,我会在这里添加我的答案。
核心数据中实体总数的计数是相当容易的:
let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext let fetchRequest = NSFetchRequest(entityName: "MyEntity") let count = context.countForFetchRequest(fetchRequest, error: nil)
我在模拟器中testing了400,000个对象,结果相当快(尽pipe不是瞬时的)。
我相信对象计数最简单和最有效的方法是将NSFetchRequest
结果types设置为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 }
在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 }
如果你想find具体的预测获取计数,我相信这是最好的方法:
NSError *err; NSUInteger count = [context countForFetchRequest:fetch error:&err]; if(count > 0) { NSLog(@"EXIST"); } else { NSLog(@"NOT exist"); }