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

era*_*orx 171 core-data objective-c

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

Bar*_*ark 299

我不知道使用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];
Run Code Online (Sandbox Code Playgroud)

  • 只是FYI,如果没有特定请求的结果,则计数== 0,NSNotFound = NSIntegerMax,所以如果没有结果,则不会执行'// Handel错误'. (4认同)
  • @LarsSchneider`countForFetchRequest的文档:error:`表示在出现错误时返回`NSNotFound`.通常,Cocoa约定中的`NSError`处理是如果没有错误发生,则`err`的值是未定义的(并且通常是危险的). (2认同)

Jim*_*eia 60

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

要计算给定实体的所有实例而不获取所有数据,请使用-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;
Run Code Online (Sandbox Code Playgroud)


Sur*_*gch 28

迅速

在Core Data中计算实体的实例总数相当容易:

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

我在400,000+对象计数的模拟器中对此进行了测试,结果相当快(尽管不是即时的).


Osc*_* S. 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;
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.


小智 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
Run Code Online (Sandbox Code Playgroud)


Fat*_*tie 7

真的只是这样:

let kBoat = try? yourContainer.viewContext.count(for: NSFetchRequest(entityName: "Boat"))
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

什么是全球yourContainer

要使用核心数据,在应用程序中的某个时刻,仅一次,您只需执行以下操作:

var yourContainer = NSPersistentContainer(name: "stuff")
Run Code Online (Sandbox Code Playgroud)

其中“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)") }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,从应用程序中的任何位置

core.container
Run Code Online (Sandbox Code Playgroud)

是你的容器,

所以在实践中要获得任何实体的计数,只需

let k = try? core.container.viewContext.count(for: NSFetchRequest(entityName: "Boat"))
Run Code Online (Sandbox Code Playgroud)


jar*_*ora 6

我为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
}
Run Code Online (Sandbox Code Playgroud)