Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c Cocoa核心数据统计实体的有效方法_Objective C_Core Data - Fatal编程技术网

Objective c Cocoa核心数据统计实体的有效方法

Objective c Cocoa核心数据统计实体的有效方法,objective-c,core-data,Objective C,Core Data,我读了很多关于核心数据的书。。但什么是对实体类型进行计数的有效方法(如SQL可以使用SELECT count(1)…)。现在我用NSFetchedResultsController选择all并获取NSArray的计数,就解决了这个问题!我确信这不是最好的方法…我不知道使用NSFetchedResultsController是否是实现目标的最有效方法(但可能是)。获取实体实例计数的显式代码如下: // assuming NSManagedObjectContext *moc NSFetchReq

我读了很多关于核心数据的书。。但什么是对实体类型进行计数的有效方法(如SQL可以使用SELECT count(1)…)。现在我用
NSFetchedResultsController
选择all并获取
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)

我在模拟器中测试了400000多个对象计数,结果相当快(虽然不是即时的)。

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

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
}
static func fetchCountFor(entityName:String,谓词:NSPredicate,onMoc-moc:NSManagedObjectContext)->Int{
变量计数:Int=0
商务部,等等{
let fetchRequest:NSFetchRequest=NSFetchRequest(entityName:entityName)
fetchRequest.predicate=谓词
fetchRequest.resultType=NSFetchRequestResultType.countResultType
做{
count=尝试moc.count(用于:fetchRequest)
}抓住{
//优雅地断言或处理异常
}
}
返回计数
}

在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
}
static func getProductCount()->Int{
让moc=(UIApplication.sharedApplication().delegate为!AppDelegate).managedObjectContext
let fetchRequest=NSFetchRequest(entityName:“产品”)
let count=try!moc.count(for:fetchRequest)
返回计数
}
实际上就是这样: “Boat”只是数据模型屏幕中实体的名称:

什么是全局容器

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

var yourContainer = NSPersistentContainer(name: "stuff")
其中“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
这是你的集装箱

所以实际上,要计算任何实体的数量

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

在Leopard上,您希望使用countForFetchRequest:而不是executeFetchRequest:并跳过以设置谓词。无谓词:获取与实体描述匹配的所有对象仅供参考,如果特定请求没有结果,则计数==0,NSNotFound=NSINTERMAX,因此如果没有结果,则不会执行“//Handel error”。setIncludesSubentities上是否有键入错误?我认为文档中的“entities”表示小写的“e”,而不是示例代码中的大写的“e”。@LarsSchneider
countForFetchRequest:error:
的文档指出,如果出现错误,将返回
NSNotFound
。一般来说,
NSError
在Cocoa约定中的处理是,如果没有发生错误,
err
的值是未定义的(通常是危险的)。
let k = try? core.container.viewContext.count(for: NSFetchRequest(entityName: "Boat"))