3

我正在处理来自 NSScreenCast 的代码示例,该示例处理导入到核心数据应用程序(链接)。我有大部分工作的例子。我可以按下刷新按钮,它解析 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。因此我的问题。我没有看到这个问题可能成为问题的任何其他地方。有什么想法吗?

迈克·莱利

4

3 回答 3

4

我刚刚修改了你的方法,你可以试试:

+ (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:效率更高,因为它只“返回给定获取请求将返回的对象数量”。您可以使用此方法检查是否有匹配的对象。

于 2012-07-20T03:57:02.653 回答
1

您正在尝试将标量值 ( ) 与谓词中NSInteger的对象值 ( ) 进行比较。NSNumber

尝试:

[NSPredicate predicateWithFormat:@"serverId = %@", [NSNumber numberWithInteger:serverId]]
于 2012-07-20T04:44:29.060 回答
0

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

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

你错过了双等号....

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

于 2012-07-20T03:57:15.747 回答