NSPredicate使用获取请求返回无结果,适用于arrays过滤
我的情况很简单:我的核心数据存储中有一些记录。 它们的一个属性是名为“localId”的字符串。 有一点,我想找到具有特定localId值的记录。 显而易见的方法是使用NSFetchRequest和NSPredicate。 但是,当我设置它时,请求返回零记录。
但是,如果我使用不带谓词的获取请求,返回所有记录,只是遍历它们寻找目标localId值,我确实找到了我正在寻找的记录。 换句话说,记录在那里,但是获取请求找不到它。
我使用获取请求和谓词的其他方法都按预期工作。 我不知道为什么这个失败了。
我想做这个:
- (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; } }
UPDATE
我遇到过遇到这个问题的其他人:
http://markmail.org/message/7zbcxlaqcgtttqo4
他也没有找到解决方案。
啊呀! 我很难过。
谢谢!
讨厌说,但这些类型的问题最常见的原因是简单的拼写错误。 确保您的属性名称和谓词相同。 确保您的属性名称和属性名称相同。 如果对属性的引用有效,但对属性名称的引用不存在,则可能存在不匹配。
您可以通过比较以下内容的回报来测试后者:
[result valueForKey:@"localID"]
…返回:
result.localID
如果localId
是一个数值,那么你应该在谓词forms中使用NSNumber
对象而不是NSString
。
[request setPredicate:[NSPredicate predicateWithFormat:@"localId == %@", [NSNumber numberWithString:localId]]];
NSPredicate
格式字符串自动引用NSString对象。