我正在处理从NSScreenCast处理导入到核心数据应用程序的代码示例。 (https://github.com/subdigital/nsscreencast/tree/master/012-core-data-importing-data/BeerBrowser)。我有大部分工作的例子。我能够推动刷新按钮,它解析json并将其导入到数据库中。但是,每次按刷新按钮时,都会重新添加相同的数据。我已经将其追溯到下面的代码。核心数据问题 - 检查项目是否存在
+ (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中的代码将其再次添加到数据库中。我做了一些调试,并且serverId确实通过了。此外,fetchrequest似乎是有效的(无法确切地调试它)。正如你所看到的,我已经为结果添加了一个NSLog,但它返回一个空的结果。因此,如果结果数为0,则返回nil。因此我的问题。我没有看到这个问题可能成为一个问题。有什么想法吗?
迈克 - 莱利
感谢您的帮助。我试了一下,仍然得到同样的问题。在深入挖掘它之后,似乎它正在比较的serverId在任何时候都不会保存到数据库中。所以setPredicate正在比较传递给没有数据的列的serverId。因此它从不匹配任何东西。我正在查看代码,看看我能否找到它。数据模型确实显示serverId。 – 2012-07-20 04:15:45
@MikeRiley'NSLog的日志是什么(@“results:%@”,结果);' &'NSLog(@“results objectAtIndex:0 =%@”,[results objectAtIndex:0]);'? – Kjuly 2012-07-20 05:25:51