gpt4 book ai didi

ios - NSPredicate 不返回任何获取请求的结果,适用于数组过滤

转载 作者:可可西里 更新时间:2023-11-01 03:13:53 26 4
gpt4 key购买 nike

我的情况很简单:我的核心数据存储中有一些记录。它们的属性之一是名为“localId”的字符串。有时我想找到具有特定 localId 值的记录。显而易见的方法是使用 NSFetchRequest 和 NSPredicate。但是,当我设置它时,请求返回零条记录。

但是,如果我使用不带谓词的获取请求,返回所有记录,并循环遍历它们以查找目标 localId 值,我确实找到了我要查找的记录。换句话说,记录在那里,但是fetch请求找不到。

我使用提取请求和谓词的其他方法都按预期工作。我不知道为什么这个失败了。

我想这样做:

- (void)deleteResultWithLocalID:(NSString *)localId {
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"WCAAssessmentResult" inManagedObjectContext:context]];
[request setPredicate:[NSPredicate predicateWithFormat:@"localId == %@", localId]];
NSError *error = nil;
NSArray *results = [context executeFetchRequest:request error:&error];
NSAssert(error == nil, ([NSString stringWithFormat:@"Error: %@", error]));
if ([results count]) [context deleteObject:[results objectAtIndex:0]];
else NSLog(@"could not find record with localID %@", localId);
[self saveContext];
}

但我最终不得不这样做:

- (void)deleteResultWithLocalID:(NSString *)localId {
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"WCAAssessmentResult" inManagedObjectContext:context]];
NSError *error = nil;
NSArray *results = [context executeFetchRequest:request error:&error];
NSAssert(error == nil, ([NSString stringWithFormat:@"Error: %@", error]));
for (WCAAssessmentResult *result in results) {
if ([result.localId isEqualToString:localId]) {
NSLog(@"result found, deleted");
[context deleteObject:result];
}
}
[self saveContext];
}

关于可能出错的任何线索?

编辑

我发现在执行提取请求后,我可以使用我正在创建的谓词来获得我期望的结果。因此,以下内容也有效:

- (WCAChecklistItem *)checklistItemWithId:(NSNumber *)itemId {
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"WCAChecklistItem" inManagedObjectContext:context]];
NSArray *foundRecords = [context executeFetchRequest:request error:nil];
foundRecords = [foundRecords filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"serverId == %@", itemId]];
if ([foundRecords count]) {
return [foundRecords objectAtIndex:0];
} else {
NSLog(@"can't find checklist item with id %@", itemId);
return nil;
}
}

更新

我遇到过其他人遇到这个问题:

http://markmail.org/message/7zbcxlaqcgtttqo4

他也没有找到解决办法。

天哪!我很难过。

谢谢!

最佳答案

如果 localId 是一个数值,那么您应该在谓词结构中使用 NSNumber 对象而不是 NSString

[request setPredicate:[NSPredicate predicateWithFormat:@"localId == %@", 
[NSNumber numberWithString:localId]]];

NSPredicate 格式化字符串自动引用 NSString 对象。

关于ios - NSPredicate 不返回任何获取请求的结果,适用于数组过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5405897/

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