objective-c data教學 - 可可核心數據有效的方法來統計實體




core executefetchrequest (8)

我讀了很多關於核心數據的內容......但是對一個實體類型進行計數的有效方式是什麼(比如SQL可以用SELECT count(1)...)。 現在我解決了這個任務,選擇所有NSFetchedResultsController並獲取NSArray的數量! 我相信這不是最好的方法...


Answers

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

要清楚的是,你不計算實體,而是計算特定實體的實例。 (為了實際計數實體,請向託管對像模型請求其實體的計數。)

要計算給定實體的所有實例而不提取所有數據,請使用-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;

迅速

核心數據中實體的實例總數很容易計算:

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

我相信最簡單和最有效的對象計數方法是將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

我只是補充一點,使它更有效率......因為它只是一個計數,你並不需要任何屬性值,當然也可以像上面的代碼示例之一那樣,你不需要子實體。

所以,代碼應該是這樣的:

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

希望能幫助到你。


我不會添加保留/發布的具體內容,除非您想要考慮降低50美元併購買Hillegass書籍,但我強烈建議在應用程序開發的早期就開始使用Instruments工具(即使您的應用程序第一!)。 為此,請運行 - >從性能工具開始。 我會從Leaks開始,它只是許多可用工具中的一個,但會在您忘記發佈時幫助向您展示。 它會放棄你將要提交的多少信息。 但看看這個教程快速起床:
可可教程:用儀器固定存儲器洩漏

實際上試圖強制洩漏可能是一個更好的方法,反過來,學習如何預防它們! 祝你好運 ;)







objective-c core-data