Cocoa Core Data 计数实体的有效方法

我读了很多关于核心数据的书。.但是对实体类型进行计数的有效方法是什么(就像 SQL 对 SELECT count (1)所做的那样)。现在我刚刚解决了这个任务,选择所有与 NSFetchedResultsController和获得的计数的 NSArray!我相信这不是最好的方式..。

64125 次浏览

我不知道使用 NSFetchResultsController 是否是实现目标的最有效方法(但它可能是)。获取实体实例计数的显式代码如下:

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

我为 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
}

其实就是这样:

let kBoat = try? yourContainer.viewContext.count(for: NSFetchRequest(entityName: "Boat"))

“船”只是数据模型屏幕上实体的名称:

enter image description here

什么是全球 yourContainer

要使用核心数据,在应用程序中的某个时刻,只需要一次性使用

var yourContainer = NSPersistentContainer(name: "stuff")

其中“ stuff”只是数据模型文件的名称。

enter image description here

你只需要一个单人模式就可以了,

import CoreData
public let core = Core.shared
public final class Core {
static let shared = Core()
var container: NSPersistentContainer!
private init() {
container = NSPersistentContainer(name: "stuff")
container.loadPersistentStores { storeDescription, error in
if let error = error { print("Error loading... \(error)") }
}
}
    

func saveContext() {
if container.viewContext.hasChanges {
do { try container.viewContext.save()
} catch { print("Error saving... \(error)") }
}
}
}

所以从应用程序的任何地方

core.container

是你的容器,

所以实际上要得到任何实体的计数

let k = try? core.container.viewContext.count(for: NSFetchRequest(entityName: "Boat"))

快速5解决方案:

        var viewContext: NSManagedObjectContext!
do {
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "insertName")
let count = try viewContext.count(for: fetchRequest)
print("Counted \(count) objects")
}
catch {
print("Error")
}