2015-10-26 5 views
6

Oto mój kod:MagicalRecord nie wraca NSDictionary na żądanie pobierania

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

NSDictionary *preferenceData = [PreferenceData MR_executeFetchRequest:fetchRequest]; 

mogę dostać ostrzeżenie od produkcji:

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

który wskazuje MR nie wraca do NSDictionary udokumentowane; czy coś jest nie tak z moim kodem? A tak przy okazji, nic nie jest zwracane przez żądanie pobierania, chociaż jest zapis, który powinien być.

+1

Gdzie widać, że oznacza to powrót 'NSDictionary'? W 'NSManagedObject + MagicalRecord.h' Wiersz 23:' + (NSArray *) MR_executeFetchRequest: (NSFetchRequest *) request; ' – sbarow

+0

https://github.com/magicalpanda/MagicalRecord/issues/229 – SpokaneDude

+0

Chcę ten (1) rekord, który jest najnowszym rekordem; zawiera wszystkie ustawienia wprowadzone przez użytkownika. Moim problemem jest/było to, że nie potrafię rozgryźć * jak * uzyskać dane z tablicy, więc pasuje do kolejności atrybutów w podmiocie ... rozwiązuje to i jestem szczęśliwym kamperem! – SpokaneDude

Odpowiedz

4

Wygląda na to, że komentarze wypracowały odpowiedź, ale nie jestem pewien, czy wszyscy są wolni.

Żądanie pobrania zwraca tablicę wyników. Zwykle obiektami reprezentującymi wyniki będzie klasa określona w modelu. Jeśli podklasujesz NSManagedObject (tak, jak powinno być), będzie to podklasa. Jeśli nie, będzie to typowy obiekt NSManagedObject, którego właściwości uzyskasz dostęp poprzez valueForKey:.

Możesz jednak poprosić o zwrócenie wyników jako słowników. Nie oznacza to, że metoda zwraca słownik. Przeciwnie, oznacza to, że każdy obiekt w tablicy będzie słownikiem.

Niezależnie od tego, w jakim formacie uzyskasz wyniki, musisz wyciągnąć obiekt, na którym Ci zależy, z tablicy. Powszechnym idiomem jest po prostu dołączenie .lastObject lub .firstObject do końca inwokacji executeFetchRequest:error:. Coś jak:

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

Magiczny rekord jest niczym więcej jak fantazyjnym opakowaniem wokół klas danych podstawowych. Zapewnia wygodne metody, ale wciąż pozostaje cała zwykła semantyka Core Data.