3

Core Data アプリケーション (リンク)へのインポートを扱う 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 に答える