Основные данные. Последующая выборка для того же объекта возвращает ноль - PullRequest
1 голос
/ 24 декабря 2011

У меня есть базовое отношение «один ко многим» в базовых данных:

  • Бренд имеет N продуктов
  • Продукт имеет 1 бренд (обратное отношение к предыдущему)

И я анализирую продукты, поступающие с WS.Когда продукт приходит, мне нужно добавить его бренд во вновь созданный продукт.

Для этого мне нужно получить Бренд и присвоить его Продукту.

+ (Brand *) getBrandWithId : (int) brand {
    NSManagedObjectContext * context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Brand" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];
    [fetchRequest setIncludesSubentities:YES];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id == %@", [[NSNumber numberWithInt:brand]description]];
    [fetchRequest setPredicate:predicate];

    NSError *error = nil;
    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
    for (Brand * brand in fetchedObjects) {
        return brand;
    }
    return nil;
}

Поскольку один продукт идет рядом с другим, эта функция вызывается последовательно несколько раз для одного и того же бренда (один и тот же идентификатор).

Поведение выглядит так:

  • При первом вызове Бренд корректно выбирается и возвращается этой функцией.
  • Во второй раз (и в следующий раз) для того же предыдущего Бренда функция возвращает ноль.

Кто-нибудь замечает, что я делаю неправильно?

1 Ответ

3 голосов
/ 24 декабря 2011
NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
for (Brand * brand in fetchedObjects) {
    return brand;
}

Этот код кажется странным.Во-первых, вы передаете NSError **, но игнорируете любую ошибку, которая может быть там возвращена.Поскольку у вас, похоже, возникают проблемы с извлечением, имеет смысл проверить это.

Во-вторых, цикл for кажется вводящим в заблуждение.Поскольку тело содержит инструкцию возврата, вы никогда не сможете выполнить цикл более одного раза.Хотя практической разницы нет, похоже, что лучшим указанием намерения здесь было бы что-то вроде:

if (fetchedObjects != nil) {
    return [fetchedObjects objectAtIndex:0];
}
...