在Core Data中搜索id

时间:2011-06-25 23:04:03

标签: iphone cocoa-touch core-data nsfetchedresultscontroller nspredicate

我在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,然后突然它起作用。

因此,在搜索身份证时,我一定有一些小错误,我似乎只是盲目地找到它,现在花两天时间将它缩小到这一点。有没有人可以就此给我一些建议?

2 个答案:

答案 0 :(得分:0)

这可能不起作用,但您是否尝试在实体中使用比“id”更复杂的名称(如“SiteID”)?有时非常短的名称与其他系统属性重叠,这会导致奇怪的问题。

答案 1 :(得分:0)

问题在于我如上所述为谓词提供了一个NSString。将其更改为int(即predicateWithFormat:@"(id == %i)")时,由于某种原因,它可以正常工作。