Trở lại một lần nữa cần trợ giúp thêm với xây dựng NSPredicates tôi :(Kết hợp 'AND' và 'OR' Điều kiện trong NSPredicate
Category
{
name:string
subs<-->>SubCategory
}
SubCategory
{
name:string
numbervalue:NSNumber
}
Tôi muốn biết làm thế nào để tạo ra một vị với VÀ và HOẶC .
Ví dụ, tôi muốn trở về mỗi loại với tên == "CATEGORY_NAME" mà còn có một tiểu thể loại với một numbervalue của "valueA" HOẶC "VALUE tỷ".
Tôi đã thử mọi kết hợp có thể có của các hàm tạo vị ngữ mà tôi có thể đưa ra nhưng tôi không thể làm cho nó hoạt động được.
Đây là nỗ lực tốt nhất của tôi cho đến thời điểm này.
NSPredicate *predicate=[NSPredicate [email protected]"(name== %@) AND (ANY subs.numbervalue==%@ OR ANY subs.numbervalue==%@)", @"aname", value1, value2];
Sửa 1
nỗ lực thứ hai. Việc lọc trên 'numbervalue' vẫn không hoạt động.
NSNumber valueA=[NSNumber numberWithInt:20];
NSNumber valueA=[NSNumber numberWithInt:90];
NSArray *arr=[NSArray arrayWithObject:valueA,valueB,nil];
predicate=[NSPredicate predicateWithFormat:@"(name==%@)AND(ANY subs.numbervalue IN %@)",@"aname",arr];
Chỉnh sửa 2
tôi đã cố gắng lọc chỉ bằng cách numberValue và đã để lại tên ra alltogether.
1) sử dụng kết quả này trong toàn bộ tập hợp được trả lại ngay cả khi chỉ 1 mục trong tập hợp có giá trị.
predicate=[NSPredicate predicateWithFormat:@"(ANY subs.numbervalue IN %@)",arr];
2) Sử dụng kết quả này trong cùng một vấn đề, mọi mục trong tập hợp sẽ được trả về ngay cả khi chỉ 1 mục phù hợp.
predicate=[NSPredicate predicateWithFormat:@"((SUBQUERY(subs, $x, $x.numbervalue == %@ or $x.numbervalue == %@)[email protected] > 0)", value1, value2];
Cũng sử dụng phiên bản đơn giản nhất dẫn đến cùng một vấn đề .... Tôi không nhận thấy điều này trước đó.
NSPredicate *predicate=[NSPredicate [email protected]"(ANY subs.numbervalue==%@ ,valueA];
Vì vậy, tôi nghĩ rằng vấn đề của tôi đã bị thu hẹp.
Danh mục là một Thực thể. Danh mục con là một Thực thể.
Danh mục có mối quan hệ một đến nhiều với Danh mục phụ và được biểu diễn dưới dạng NSSet của Danh mục phụ.
Mỗi Danh mục con có một thuộc tính có tên là numbervalue.
Sửa 3
Để kiểm tra tôi có 2 chuyên cung. Cả hai Danh mục đều có 10 người đăng ký, mỗi danh mục có một sự sụt giảm 1 -10;
Sử dụng mã này cả hai danh mục đều được trả về cùng với tất cả 10 người đăng ký cho mỗi danh mục.
Kết quả mong đợi là cả hai danh mục được trả lại, mỗi danh mục chỉ có 2 người đăng ký.
Tôi đã theo dõi tất cả các đối tượng của tôi và dữ liệu là chính xác. Vấn đề là tôi không thể trả lại một thể loại đã lọc subs.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSManagedObjectContext *context=[[DataSource sharedDataSource]managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Category" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
NSPredicate *predicate;
NSNumber *a=[NSNumber numberWithFloat:1];
NSNumber *b=[NSNumber numberWithFloat:2];
predicate=[NSPredicate predicateWithFormat:@"(SUBQUERY(subs,$x,$x.numbervalue==%@ or $x.numbervalue==%@)[email protected]> 0)",a,b];
[fetchRequest setPredicate:predicate];
[fetchRequest setSortDescriptors:sortDescriptors];
NSError *error = nil;
[NSFetchedResultsContoller deleteCacheWithName:nil];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"name" cacheName:@"Master"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
Bạn đã kiểm tra 'NSCompoundPredicate'? Nó sẽ giúp bạn. Ngoài ra, hãy thử sử dụng '... AND (ANY subs.numberValue IN% @)", @ "fooName", numArray' – Eimantas
cảm ơn các mẹo – dubbeat
sử dụng $ x.numbervalue chứ không phải $ numbervalue. Sau đó thử đặt bộ nhớ cache thành nil đầu tiên và xem kết quả –