Основные данные iPhone - простой запрос - PullRequest
1 голос
/ 21 января 2010

Я пытаюсь создать приложение Core Data для iPhone. Одна из сущностей, которую я отслеживаю, - это автомобили, а один атрибут каждого автомобиля - «производитель».

В разделе «Изменить автомобиль» моего приложения у меня есть UIPickerView, который необходимо загрузить с каждым из уникальных производителей, которые ранее были введены в систему. Я пытаюсь создать NSFetchRequest, чтобы получить массив уникальных атрибутов «производителя» и использовать его для заполнения UIPickerView.

Проблема, с которой я сталкиваюсь, заключается в том, что, независимо от того, есть ли в хранилище данных ноль записей или 100, всегда есть одна запись в выполненном запросе выборки в нулевом элементе со значением @ "".

Я делаю это неправильно или есть более простой способ сделать это? Я хотел бы просто запустить быстрый SQL-запрос !!!

Мой код ниже:

// Populate the manufacturerNameList array
NSManagedObjectContext *moc = [self.selectedLease managedObjectContext];
NSEntityDescription *ed = [NSEntityDescription entityForName:@"Car" inManagedObjectContext:moc];
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
[fetchRequest setEntity:ed];

// Get only manufacturer and only uniques
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"manufacturer",nil]];
[fetchRequest setReturnsDistinctResults:YES];

// Sort by manufacturer in ascending order
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"manufacturer" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

NSError *error = nil;
self.manufacturerNameList = [moc executeFetchRequest:fetchRequest error:&error];
if (error) {
     // Handle the error
}

NSLog(@"The count of self.propertyNameList is %i",[self.propertyNameList count]);

Спасибо!

Ответы [ 3 ]

2 голосов
/ 21 января 2010

manufacturerNameList будет массивом Car сущностей, а не именами производителей. Кроме того, вам нужно передать NSArray из NSPropertyDescription объектов setPropertiesToFetch, а не только именам атрибутов.

Вот как вы устанавливаете свойство:

NSDictionary *entityProperties = [ed propertiesByName];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:[entityProperties objectForKey:@"manufacturer"], nil]];

Результатом executeFetchRequest: будет NSArray из Car сущностей, поэтому вам придется извлечь значения атрибута manufacturer в цикле или что-то в этом роде.

Возможно, вы захотите создать сущность Manufacturer, на которую ссылается ваша сущность Car, что позволит вам делать больше запросов так, как вы пытаетесь прямо сейчас.

1 голос
/ 21 января 2010

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

Автомобиль << -> Производитель

Сущность «Производитель» может иметь строковый атрибут «имя».

Затем вы можете получить полный список названий производителей, извлекая все объекты «Производитель» и просматривая свойство «name».

0 голосов
/ 21 января 2010

Самое простое объяснение состоит в том, что у вас есть автомобильная сущность с пустым значением производителя. Когда предикат сортирует выборку, пустая строка будет ранжироваться первой.

Я бы зарегистрировал весь self.propertyNameList и увидел бы, что вы на самом деле получаете обратно.

...