我在CoreData和NSPredicate中遇到了一些意想不到的行为。在大型数据库中,我有不同的管理对象相互关联。但是,我有以下问题。当给出一个id(NSNumber,作为NSString给出这个函数)时,除非我先保存整个上下文,否则我得不到结果。我不想这样做,因为它需要太多时间(因为它是一大组数据)。代码是:
- (DOSite *) findSite:(NSString *) siteId {
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"(id = %@)", siteId];
[NSFetchedResultsController deleteCacheWithName:nil];
[[self fetchedResultsController].fetchRequest setPredicate:predicate];
NSError *fetchError;
if (![[self fetchedResultsController] performFetch:&fetchError]) {
// Handle the error.
// This is a serious error and should advise the user to restart the application
NSLog(@"Fetching data error: %@", [fetchError localizedDescription]);
}
if([[[self fetchedResultsController] fetchedObjects] count] == 0){
return NULL;
}
return (DOSite *)[[[self fetchedResultsController] fetchedObjects] objectAtIndex:0];
}
因此,当我添加x个项目(使用+[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]
)时,对所有项目进行搜索会返回正确数量的项目。
搜索字符串时(例如predicateWithFormat:@"(name LIKE %@)"
),我得到了肯定的结果,但在使用上面的代码predicateWithFormat:@"(id = %@)
时,我的结果为零。
我可以获得结果的唯一方法是保存整个上下文然后执行fetchRequest,然后突然它起作用。
因此,在搜索身份证时,我一定有一些小错误,我似乎只是盲目地找到它,现在花两天时间将它缩小到这一点。有没有人可以就此给我一些建议?
答案 0 :(得分:0)
这可能不起作用,但您是否尝试在实体中使用比“id”更复杂的名称(如“SiteID”)?有时非常短的名称与其他系统属性重叠,这会导致奇怪的问题。
答案 1 :(得分:0)
问题在于我如上所述为谓词提供了一个NSString。将其更改为int(即predicateWithFormat:@"(id == %i)"
)时,由于某种原因,它可以正常工作。