Đối với cuộc sống của tôi, tôi dường như không thể làm được điều này.Làm cách nào để bạn xây dựng biến vị ngữ cho NSFetchRequest setHavingPredicate :?
Giả sử thực thể của chúng tôi là đối tượng được quản lý với trường trạng thái và trường đơn đặt hàng.
Tôi làm cách nào để nhận tất cả các đơn đặt hàngBài viết có nhiều đơn đặt hàng giống nhau?
Vui lòng không có câu trả lời để chỉ làm một truy vấn con với @count trong vị từ chính, vì tôi biết giải pháp đó, điểm của bài đăng này là hiểu cách sử dụng vị từ có dữ liệu cốt lõi. có thể nhanh hơn một truy vấn phụ. (trừ khi bạn giải thích lý do tại sao tôi không thể sử dụng điều khoản có)
Mã sau đây sẽ trả về một loạt từ điển có số đơn đặt hàng trên mỗi số đơn đặt hàng. Điều tôi muốn là có thể thêm mệnh đề có để hạn chế yêu cầu của tôi chỉ trả về các từ điển đại diện cho các đối tượng của những đơn hàng có số lượng lớn hơn 1.
Đây là mã cho đến nay và nỗ lực của tôi ngữ:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"OrderedEntry"
inManagedObjectContext:context];
[fetchRequest setEntity:entity];
[fetchRequest setResultType:NSDictionaryResultType];
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"(status == %@)",[NSNumber numberWithInt:EntryStatusAlive]];
[fetchRequest setPredicate:predicate];
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath: @"order"]; // Does not really matter
NSExpression *maxExpression = [NSExpression expressionForFunction: @"count:"
arguments: [NSArray arrayWithObject:keyPathExpression]];
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
[expressionDescription setName: @"orderCount"];
[expressionDescription setExpression: maxExpression];
[expressionDescription setExpressionResultType: NSInteger32AttributeType];
[fetchRequest setPropertiesToFetch: [NSArray arrayWithObjects:expressionDescription,@"order",nil]];
[fetchRequest setPropertiesToGroupBy:[NSArray arrayWithObjects:@"order",nil]];
//[fetchRequest setHavingPredicate:[NSPredicate predicateWithFormat:@"@count > 1"]];
//[fetchRequest setHavingPredicate:[NSComparisonPredicate predicateWithLeftExpression:maxExpression rightExpression:[NSExpression expressionForConstantValue:[NSNumber numberWithInteger:1]] modifier:NSDirectPredicateModifier type:NSGreaterThanPredicateOperatorType options:NSCaseInsensitivePredicateOption]];
NSError *error;
NSArray * array = [context executeFetchRequest:fetchRequest error:&error];
Bạn đã bao giờ nhận được một câu trả lời về vấn đề này? Tôi đã tìm thấy nhiều tham chiếu vô ích đối với 'setHavingPredicate' không cung cấp dấu hiệu cho thấy định dạng của vị từ này cần phải là gì. Không có ví dụ làm việc, và không có gì mà tôi đã thử đã làm việc ... –
@ChristopherKing Không, tôi về cơ bản đã từ bỏ, KHÔNG có thông tin trên web và các diễn đàn web của Apple không hữu ích hơn. Tôi thực sự tin rằng không ai sử dụng điều này, vì nó rất dễ dàng để xây dựng các chức năng tương tự của các Có predicate chỉ bằng cách làm một lấy bình thường và sau đó chuyển qua các dữ liệu với một bộ lọc hoặc bằng tay với một vòng lặp. Chúng tôi muốn biết bởi vì luôn có 'cách đúng đắn' để làm điều gì đó, đặc biệt nếu api được cung cấp. – thewormsterror