Поиск идентификатора в Core Data - PullRequest
0 голосов
/ 26 июня 2011

Я получаю неожиданное поведение с CoreData и NSPredicate.В большой базе данных у меня есть разные управляемые объекты, связанные друг с другом.Однако у меня проблема со следующим.При задании идентификатора (NSNumber, заданный как NSString для этой функции) я не получаю результат, если сначала не сохраню весь контекст.Я не хочу этого делать, так как это занимает слишком много времени (так как это большой набор данных).Код:

- (DOSite *) findSite:(NSString *) siteId {
    NSPredicate* predicate = [NSPredicate predicateWithFormat:@"(id = %@)", siteId];

    [NSFetchedResultsController deleteCacheWithName:nil];
    [[self fetchedResultsController].fetchRequest setPredicate:predicate];

    NSError *fetchError;

    if (![[self fetchedResultsController] performFetch:&fetchError]) {
        // Handle the error.
        // This is a serious error and should advise the user to restart the application
        NSLog(@"Fetching data error: %@", [fetchError localizedDescription]);
    }

    if([[[self fetchedResultsController] fetchedObjects] count] == 0){
        return NULL;
    }
    return (DOSite *)[[[self fetchedResultsController] fetchedObjects] objectAtIndex:0];
}

Поэтому, когда я добавляю x элементов (используя +[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]), при выполнении поиска по всем элементам возвращается правильное количество элементов.

При поискестрока (например, predicateWithFormat:@"(name LIKE %@)") Я получаю положительные результаты, но при использовании приведенного выше кода predicateWithFormat:@"(id = %@) я получаю нулевые результаты.

Единственный способ получить результаты - сохранить весь контекст и затем выполнитьfetchRequest, потом вдруг это сработает.

Так что должно быть что-то маленькое, я ошибаюсь в поиске идентификатора, мне просто кажется, что я слеп, чтобы найти его и потратить на него два дня, чтобы сузить его до этоготочка.Есть кто-нибудь, кто может дать мне совет по этому поводу?

Ответы [ 2 ]

0 голосов
/ 26 июня 2011

Проблема заключалась в том, что я дал NSString для предиката, как описано выше.При изменении на int (т.е. predicateWithFormat:@"(id == %i)") он по какой-то причине работает нормально.

0 голосов
/ 26 июня 2011

Это может не сработать, но вы пытались использовать более сложное имя, чем «id» в вашей сущности (например, «SiteID»)? Иногда очень короткие имена перекрываются с другими системными свойствами, и это вызывает странные проблемы.

...