gpt4 book ai didi

ios - 如何形成谓词以从包含来自数组的字符串元素的核心数据中获取对象

转载 作者:行者123 更新时间:2023-12-01 20:12:43 25 4
gpt4 key购买 nike

我需要创建一个谓词来从核心数据中获取对象,
我的实体“表格”如下所示:

@interface EEForm (CoreDataProperties)
@property (nullable, nonatomic, retain) NSDate *date;
@property (nullable, nonatomic, retain) NSString *descriptor;
@property (nullable, nonatomic, retain) NSString *location;
@property (nullable, nonatomic, retain) NSMutableSet<Participants *> *participants;

实体“参与者”如下所示:
@interface Participants (CoreDataProperties)

@property (nonatomic, assign) NSInteger indexRow;
@property (nullable, nonatomic, retain) NSString *participant;
@property (nullable, nonatomic, retain) EEForm *form;

我想在参与者字段的基础上获取对象,该字段包含给定数组中的所有对象(此数组由字符串对象组成,它根据用户选择的内容而变化)。
获取请求由 FetchResultController 执行。我在它的初始化中设置了谓词。

我是这样做的,但它包括所有包含给定数组中至少一个对象的对象。
- (NSFetchedResultsController *)fetchResultController {
if(_fetchResultController != nil) {
return _fetchResultController;
}

NSPredicate *lPredicate = [NSPredicate predicateWithFormat:@"ANY participants.participant IN %@", _selectedForPredicatel];
NSFetchRequest *lRequest = [[NSFetchRequest alloc]init];
[lRequest setPredicate:lPredicate];
NSEntityDescription *lEntity = [NSEntityDescription entityForName:@"Form" inManagedObjectContext:self.managedObjectContext];
[lRequest setEntity:lEntity];
[lRequest setFetchBatchSize:10];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"date" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor, nil];
[lRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *fetchResultController = [[NSFetchedResultsController alloc]initWithFetchRequest:lRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
fetchResultController.delegate = self;
self.fetchResultController = fetchResultController;
NSError *error = nil;
if(![[self fetchResultController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return fetchResultController;
}

您能否建议如何正确设置谓词以过滤包含给定数组中所有元素的对象。

编辑:
用于谓词的数组如下所示:
   _selectedForPredicatel = [[NSMutableArray alloc]initWithObjects:@"Child",@"Adult", @"Group of people", @"Family", @"Teenager", nil];

每次用户选择过滤器“表单”对象的参数时,这个数组都会更新,所以我需要根据它来完成获取请求。因此,如果 'Form' 包含参与者:@"Child",@"Adult",但在数组 _selectedForPredicatel 中有对象:@"Adult",@"Group of people",在这种情况下,此 'Form' 不应该被取走。应该只获取包含 _selectedForPredicatel 数组的两个元素的“表单”。
非常感谢您的任何建议。

最佳答案

如果对于每个用户的选择,至少有一个 Participant,您希望包含这些表单。有一个 participant匹配的属性。

如果参与者名称是唯一的(至少对于每个 Form ),您可以计算匹配项并与用户选择的计数进行比较。但如果不是,则需要分别创建一个谓词测试每个用户的选择,然后将结果组合成一个大谓词:

NSPredicate *template = [NSPredicate predicateWithFormat:@"(SUBQUERY(participants, $p, $p.participant == $SELECTED).@count > 0)"];
NSMutableArray *predicateArray = [NSMutableArray array];
for (NSString *testString in _selectedForPredicatel) {
NSDictionary *subsVars = @{@"SELECTED" : testString};
NSPredicate *testPredicate = [template predicateWithSubstitutionVariables:subsVars];
[predicateArray addObject:testPredicate];
}
NSPredicate *finalPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicateArray];
NSLog(@"finalPredicate is %@", finalPredicate);
NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"ListEntity"];
fetch.predicate = finalPredicate;

这里 template是使用 $SELECTED 的虚拟谓词作为用户选择的占位符。 for 循环使用它为每个用户的选择创建一个谓词并将其添加到一个可变数组中。最终谓词是通过使用 AND 复合谓词数组来构建的。条款。

它非常困惑(最终的谓词已经够糟糕了,底层的 SQL 很糟糕),所以性能可能很糟糕。

关于ios - 如何形成谓词以从包含来自数组的字符串元素的核心数据中获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37464898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com