2009-07-15 25 views
161

Tôi đọc nhiều về Dữ liệu lõi .. nhưng cách hiệu quả để tính số thực thể (như SQL có thể thực hiện với số lượng SELECT (1) ...). Bây giờ tôi chỉ giải quyết nhiệm vụ này với việc chọn tất cả với NSFetchedResultsController và nhận được số lượng NSArray! Tôi chắc chắn đây không phải là cách tốt nhất ...Cách thức hiệu quả của dữ liệu lõi cacao để đếm các thực thể

Trả lời

285

Tôi không biết liệu sử dụng NSFetchedResultsController là cách hiệu quả nhất để đạt được mục tiêu của bạn (nhưng có thể). Mã rõ ràng để nhận được tổng số các thể hiện thực thể là dưới đây:

// 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

On Leopard bạn muốn sử dụng countForFetchRequest: và không executeFetchRequest: – IlDan

+0

Có! Cảm ơn bạn. Tôi sẽ cập nhật mã. –

+0

Và bỏ qua để đặt biến vị ngữ. Không có biến vị ngữ: nhận tất cả các đối tượng khớp với mô tả thực thể – IlDan

54

Để rõ ràng, bạn không tính các thực thể, nhưng các trường hợp của một thực thể cụ thể. (Để đếm các thực thể theo nghĩa đen, hãy hỏi mô hình đối tượng được quản lý để đếm số thực thể của nó.)

Để đếm tất cả các cá thể của một thực thể cụ thể mà không tìm nạp tất cả dữ liệu, sử dụng -countForFetchRequest:.

Ví dụ:

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

tôi sẽ chỉ thêm rằng để làm cho nó thậm chí còn hiệu quả hơn ... và bởi vì nó chỉ là một số, bạn không thực sự cần bất kỳ giá trị tài sản và chắc chắn thích một trong các ví dụ mã ở trên bạn cũng không cần các thực thể con.

Vì vậy, mã nên được như thế này:

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

Hy vọng nó giúp.

9

Tôi tin rằng cách dễ nhất và hiệu quả nhất để đếm đối tượng là đặt NSFetchRequest loại kết quả thành NSCountResultType và thực hiện phương thức với phương thức 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 
20

Swift

Nó là khá dễ dàng để có được một số của tổng số các trường hợp của một thực thể trong Core Data:

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

Tôi đã thử nghiệm này trong mô phỏng với một 400,000+ số lượng đối tượng và kết quả khá nhanh (mặc dù không phải tức thời).

0

Nếu bạn muốn tìm đếm cho cụ thể xác lấy, tôi tin rằng đây là cách tốt nhất:

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

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

Tôi đã viết một phương pháp hữu ích đơn giản cho Swift 3 để lấy số lượng của các đối tượng.

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

Trong 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 
} 
Các vấn đề liên quan