MagicalRecord не возвращает NSDictionary в запросе на выборку

Вот мой код:

NSPredicate *filter = [NSPredicate predicateWithFormat:@"aMostRecentFlag == 1"];  //  find old records
NSFetchRequest *fetchRequest = [PreferenceData MR_requestAllWithPredicate: filter];
[fetchRequest setResultType: NSDictionaryResultType];

NSDictionary *preferenceData = [PreferenceData MR_executeFetchRequest:fetchRequest];

Я получаю предупреждение от сборки:

Incompatible pointer types initializing 'NSDictionary *' with an expression of type 'NSArray *'

что указывает, что MR не возвращает NSDictionary, как задокументировано; что-то не так с моим кодом? И, кстати, по запросу извлечения ничего не возвращается, хотя есть запись, которая должна была быть.

1 ответ

Кажется, что комментарии выработали ответ, но я не уверен, что все ясно.

Запрос на выборку возвращает массив результатов. Обычно объектами, представляющими результаты, будет класс, указанный в модели. Если вы подкласс NSManagedObject (как и должно быть), это будет подкласс. Если нет, то это будет общий NSManagedObject, свойства которого вы получаете через valueForKey:,

Однако вы можете попросить вернуть результаты в виде словарей. Это не значит что executeFetchRequest:error: Метод возвращает словарь. Скорее это означает, что каждый объект в массиве будет словарем.

В каком бы формате вы ни получили результаты, вы должны извлечь из массива интересующий вас объект (ы). Обычная идиома - просто добавить .lastObject или же .firstObject до конца executeFetchRequest:error: призывание. Что-то вроде:

MyObject *object = [context executeFetchRequest:request error:NULL].firstObject;

Magical Record - это не более чем модная оболочка для классов Core Data. Это обеспечивает удобные методы, но все обычная семантика Базовых Данных все еще сохраняется.

Другие вопросы по тегам