核心数据问题 – 检查项目是否存在

我正在处理从NSScreenCast处理导入到核心数据应用程序的代码示例。 (https://github.com/subdigital/nsscreencast/tree/master/012-core-data-importing-data/BeerBrowser)。 我有大部分工作的例子。 我能够推动刷新button,它parsingJSON并将其导入到数据库中。 但是,每次按下刷新button,都会重新添加相同的数据。 我已经追溯到下面的代码。

+ (Brewery *)breweryWithServerId:(NSInteger)serverId usingManagedObjectContext:(NSManagedObjectContext *)moc { NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:[Brewery entityName]]; [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"serverId = %d", serverId]]; [fetchRequest setFetchLimit:1]; NSError *error = nil; NSArray *results = [moc executeFetchRequest:fetchRequest error:&error]; NSLog(@"results: %@", results); if (error) { NSLog(@"ERROR: %@ %@", [error localizedDescription], [error userInfo]); exit(1); } if ([results count] == 0) { return nil; } NSLog(@"results objectAtIndex:0 = %@", [results objectAtIndex:0]); return [results objectAtIndex:0]; } 

这种方法会发生什么,它试图查看数据库中是否已经存在该项目。 如果这个调用返回nil,那么MasterViewController中的代码再次将它添加到数据库中。 我已经做了一些debugging,并且serverId通过。 此外,fetchrequest似乎是有效的(还没有能够debugging它是肯定的)。 正如你所看到的,我已经把结果放在一个NSLog中,但是它返回一个空的结果。 那么,如果结果计数为0,则返回nil。 因此我的问题。 我没有看到这个问题在哪里可能是一个问题。 有什么想法吗?

麦克莱利

我只是修改你的方法,你可以试试看:

 + (Brewery *)breweryWithServerId:(NSInteger)serverId usingManagedObjectContext:(NSManagedObjectContext *)moc { NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:[Brewery entityName]]; [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"serverId == %d", serverId]]; [fetchRequest setFetchLimit:1]; NSError *error = nil; // if there's no object fetched, return nil if ([managedObjectContext countForFetchRequest:fetchRequest error:&error] == 0) { NSLog(@"!!!WARN: NO Object Matches."); return nil; } // fetch your object Brewery *result = [[moc executeFetchRequest:fetchRequest error:&error] lastObject]; if (error != nil) { NSLog(@"ERROR: %@ %@", [error localizedDescription], [error userInfo]); return nil; } NSLog(@"results objectAtIndex:0 = %@", result); return result; } 

注意: -countForFetchRequest:error:效率更高,因为它只返回给定获取请求将返回的对象的数量。 你可以使用这个方法来检查是否有匹配的对象。

您试图在谓词中比较标量值( NSInteger )和对象值( NSNumber )。

尝试:

 [NSPredicate predicateWithFormat:@"serverId = %@", [NSNumber numberWithInteger:serverId]] 

我认为你的谓词有问题。 它应该是:

 [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"serverId == %d", serverId]]; 

你错过了双等于….

发现没关系。 你应该检查以确保你的moc不是零。 你确定你正确的传递了吗?