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. Это обеспечивает удобные методы, но все обычная семантика Базовых Данных все еще сохраняется.