Как получить различные значения в Core Data?

Итак, просматривая Основные фрагменты данных, я нашел следующий код:

...
[request setEntity:entity]; 
[request setResultType:NSDictionaryResultType];
[request setReturnsDistinctValues:YES];
[request setPropertiesToFetch:[NSArray arrayWithObject:@"<#Attribute name#>"]];

// Execute the fetch
NSError *error;
id requestedValue = nil; // WTF? This isn't defined or used anywhere
NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error];
if (objects == nil) {
     // handle the error
}

Это здорово и кажется идеальным для того, что мне нужно... но как он на самом деле его использует? Я предполагаю, что, вернув словари, мне нужен ключ, чтобы получить значения - но где ключ определен? Это строка "id requestedValue = nil"? Если да, то как "requestValue" становится ключом? Xcode дает мне предупреждение компилятора о неиспользуемой переменной в объявлении "requestValue". Я чувствую, что здесь что-то не хватает.

Заранее благодарим за любую помощь, которую вы можете предложить.

Ответы

Ответ 1

requestValue ничего и явно не используется (возможно, это было частью какого-то другого примера, который получил cut & paste в этом примере кода - кто знает). Вы можете просто игнорировать его.

Ключи для словаря совпадают с атрибутами, которые вы выбрали и определены в вашей модели. Например, если у вас есть лицо с тремя атрибутами, именами, возрастными, телефонными номерами, и вы запросили только имя, это были бы только ключи с данными в ваших словарях. Итак:

[request setEntity:entity]; 
[request setResultType:NSDictionaryResultType];
[request setReturnsDistinctResults:YES];
[request setPropertiesToFetch:[NSArray arrayWithObject:@"name"]];

// Execute the fetch
NSError *error;
NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error];
if (objects == nil) {
     abort();
}
for( NSDictionary* obj in objects ) {
  NSLog(@"Person: %@", [obj objectForKey:@"name"]);
}
// ...

Итак, если у вас в вашем хранилище данных есть 5 человек по имени Боб, Салли, Джо, Фрейда и Сью, вы увидите, что эти имена распечатываются. Если вы хотите использовать любой из других атрибутов (например, их возраст), вы должны добавить это к массиву, установленному в setPropertiesToFetch:.

В большинстве случаев, вероятно, лучше всего просто получить управляемый объект. Объект будет ошибочен, поэтому вы даже не будете добавлять атрибуты в память, если вы не получите к ним доступ. Кроме того, если вы хотите внести изменения в объекты, вы можете и сохранить их в хранилище (с управляемыми объектами).