gpt4 book ai didi

iphone - 使用 NSPredicate contains 查找 coredata 实体字段内的字符

转载 作者:行者123 更新时间:2023-12-03 18:51:41 27 4
gpt4 key购买 nike

我正在尝试查找包含特定字母序列的所有客户。我想要与 NSString 的 rangeofString 相同的功能,除了不区分大小写。这是我的方法:

-(NSArray *) db_search: (NSString *) table where: (NSString*) fieldKey contains: (NSString*) value withSortField: (NSString *) sortField{
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity = [NSEntityDescription entityForName:table inManagedObjectContext:context];
if (fieldKey != nil){
NSPredicate *predicate = [NSPredicate
predicateWithFormat:@"(%@ contains[c] %@)",
fieldKey,value];
[request setPredicate:predicate];
}
[request setEntity:entity];

if (sortField != nil){
NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:[self extractSortField:sortField] ascending:[self isAscending:sortField]] autorelease];
NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortDescriptor, nil] autorelease];
[request setSortDescriptors:sortDescriptors];
}

NSError *error;
return [context executeFetchRequest:request error:&error];
}

我用这些值来调用它:

NSArray * results = [self db_search:@"Customer" where:@"fullname" contains:@"matt" withSortField:nil];

当我尝试打印结果时,它没有得到所有 Matts、Matthews 等,而是卡住了。我调试了它,我们甚至没有得到一个空的 NSArray。我将 NSArray 打印到控制台,但没有得到 0 个元素。我什么也没得到。

我尝试将数据库转储到控制台,它包含所有正确的内容。帮助!!!

=更新============================================= ============

我正在使用 %K,但遇到了奇怪的运行时错误:

if (searchResults1 != nil){
NSLog(@"%Matches: %i", [searchResults1 count]);
}else {
NSLog(@"Was NULL");
}

它在 NSLog(@"%Matches: 行上。它是一个 BAD EXC 错误。所以 searchResults1 不为零,但当我尝试读取计数时它崩溃了?当我调试时,searchResults1 确实是一个 NSArray 但它不是里面好像没有什么东西。

最佳答案

看起来你的问题是你的谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(%@ contains[c] %@)", fieldKey,value];

当您传入 fieldKey = @"fullname"value = @"matt" 时,此谓词将等效于:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"('fullname' contains[c] 'matt')"];

你看到问题了吗?它将“fullname”视为原始字符串,而不是字段的名称。这是因为您在格式字符串中使用了 %@ 修饰符。当 NSPredicate 遇到这些时,它会说“啊哈!这里替换的值将是一个常量”。你真正想要它做的是说“啊哈!这里替换的值将是一个标识符”。

因此,不要使用 %@,而是使用 %K。这是一个专门用于谓词的特殊修饰符,它意味着在字符串中替换为标识符(实际上是“键路径”),这意味着它将使您的谓词成为:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(fullname contains[c] 'matt')"];

这就是您要寻找的内容。

关于iphone - 使用 NSPredicate contains 查找 coredata 实体字段内的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5336015/

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