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

时间:2009-07-15 21:47:46

标签: objective-c core-data

我读了很多关于核心数据的内容..但是对一个实体类型进行计数的有效方法是什么(比如SQL可以用SELECT count(1)...)。现在我刚刚使用NSFetchedResultsController选择所有内容并获取NSArray的计数来解决此任务!我相信这不是最好的方式......

8 个答案:

答案 0 :(得分:294)

我不知道使用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 :(得分:59)

要明确的是,您不是计算实体,而是计算特定实体的实例。 (要按字面计算实体,请向托管对象模型询问其实体的数量。)

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

答案 2 :(得分:22)

我只是添加它以使其更高效...并且因为它只是一个计数,你真的不需要任何属性值,并且肯定像上面的一个代码示例你不需要子实体要么。

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

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

希望它有所帮助。

答案 3 :(得分: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

答案 4 :(得分:5)

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

答案 5 :(得分:2)

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

答案 6 :(得分:2)

真的就是这个:

$ mongo
MongoDB shell version v4.2.2
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("5d2a9b35d-4ef1-4eeeb0-8fee2-ac9974e7ee66a") }
MongoDB server version: 4.2.2
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
    http://docs.mongodb.org/
Questions? Try the support group
    http://groups.google.com/group/mongodb-user
2020-02-03T13:29:07.716+0000 I  STORAGE  [main] In File::open(), ::open for '//.mongorc.js' failed with Permission denied

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

enter image description here

什么是全局let kBoat = try? yourContainer.viewContext.count(for: NSFetchRequest(entityName: "Boat"))

要使用核心数据,只需在您的应用中的某个时间使用一次,就可以

yourContainer

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

enter image description here

为此,您只需一个单例,

var yourContainer = NSPersistentContainer(name: "stuff")

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

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

答案 7 :(得分:0)

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

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

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