iPhone CoreData присоединиться - PullRequest
3 голосов
/ 17 марта 2010

это моя основная модель данных:

enter image description here

Я пытаюсь получить все LanguageEntries из базы данных для данной категории.categoryName и languageset.languageSetName, например.

NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"LanguageEntry" inManagedObjectContext:del.managedObjectContext];
    [fetchRequest setEntity:entity];

NSString* predicateString = [NSString stringWithFormat:@"Category.categoryName = %@ AND LanguageSet.languageSetName = %@", 
                        @"Food", @"English####Spanish"];

fetchRequest.predicate = [NSPredicate predicateWithFormat:predicateString];

NSError *error = nil;
NSArray* objects = [del.managedObjectContext executeFetchRequest:fetchRequest error:&error];

Это всегда возвращает 0 объектов. Если я установлю строку предиката для соответствия одной взаимосвязи (например, Category.categoryName = Food или languageSet.languageSetName = English #### Испанский), он вернет данные.

Это сбивает с толку, кто-нибудь может пролить свет?

-> Кен

Ответы [ 2 ]

9 голосов
/ 17 марта 2010

Вы не можете думать о базовых данных как о SQL. В Core Data не существует такой вещи, как «соединение». В этом случае вы пытаетесь найти пересечение двух наборов объектов. Близко к объединению логически, но не в деталях реализации. И программист дьявол всегда в деталях.

Попробуйте использовать логическое равенство "==" следующим образом:

@"Category.categoryName == %@ AND LanguageSet.languageSetName == %@"

Я верю, что это решит вашу проблему.

В модели данных есть скрытый редактор предикатов. Это может помочь вам настроить предикаты, даже если вы не встраиваете их в выборки в самой модели. Просто выберите сущность, в вашем случае «LanguageEntity», затем добавьте Запрос на получение . Появится предикат редактирования, и вы можете использовать диалоговое окно для создания предиката. Он будет отображать текстовую версию предиката, которую вы можете скопировать в свой код.

1 голос
/ 24 апреля 2015

Предикат не был создан правильно, вы должны передать параметры вateateWithFormat. Это должно было быть:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"Category.categoryName = %@ AND LanguageSet.languageSetName = %@", 
                                                          @"Food", 
                                                          @"English####Spanish"];

Если вам интересно, что он делает, он автоматически помещает кавычки вокруг строковых параметров, которые требуются при использовании строки в предикате. При создании запроса с использованием метода форматирования NSString, в котором не были указаны требуемые кавычки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...