Jestem nowy w Core Data. Zauważyłem, że typy kolekcji nie są dostępne jako typy atrybutów i chciałbym wiedzieć, jaki jest najbardziej efektywny sposób przechowywania danych typu tablica / słownik jako atrybutu (np. Elementy składające się na adres, takie jak ulica, miasto itp. nie wymaga oddzielnej jednostki i jest wygodniej przechowywany jako słownik / tablica niż oddzielne atrybuty / pola). Dziękuję Ci.
objective-c
ios
core-data
nsarray
nsdictionary
RunLoop
źródło
źródło
Odpowiedzi:
W Core Data nie ma „rodzimej” tablicy ani typu słownika. Możesz przechowywać atrybut
NSArray
lub anNSDictionary
jako atrybut podlegający transformacji. Spowoduje to użycieNSCoding
do serializacji tablicy lub słownika doNSData
atrybutu (i odpowiedniej deserializacji po uzyskaniu dostępu). Zaletą tego podejścia jest to, że jest to łatwe. Wadą jest to, że nie możesz wykonywać zapytań do tablicy lub słownika (jest przechowywany jako BLOB w magazynie danych) i jeśli zbiory są duże, być może będziesz musiał przenieść wiele danych do / z magazynu danych (jeśli jest magazyn danych SQLite), aby odczytać lub zmodyfikować niewielką część kolekcji.Alternatywą jest użycie relacji Core Data do wielu w celu modelowania semantyki kolekcji tablicy lub słownika. Tablice są łatwiejsze, więc zacznijmy od tego. Relacje Core Data to-many w rzeczywistości modelują zestaw, więc jeśli potrzebujesz funkcji przypominającej tablicę, musisz albo posortować zestaw (użycie właściwości pobranej jest wygodnym sposobem, aby to zrobić) lub dodać dodatkowy atrybut indeksu do encji który przechowuje elementy tablicy i samodzielnie zarządza indeksami. Jeśli przechowujesz jednorodną tablicę (wszystkie wpisy są tego samego typu), łatwo jest modelować opis jednostki dla jednostek tablicy. Jeśli nie, będziesz musiał zdecydować, czy użyć przekształcalnego atrybutu do przechowywania danych pozycji, czy też utworzyć rodzinę jednostek pozycji.
Modelowanie słownika będzie prawdopodobnie wymagało relacji to-many z zestawem jednostek, które przechowują klucz i wartość. Zarówno klucz, jak i wartość są analogiczne do jednostki pozycji dla tablicy, opisanej powyżej. Mogą więc być typami natywnymi (jeśli znasz je z wyprzedzeniem), atrybutem podlegającym transformacji lub relacją do instancji z rodziny jednostek specyficznych dla typu.
Jeśli to wszystko brzmi trochę zniechęcająco, to tak. Przetwarzanie dowolnych danych do struktury zależnej od schematu, takiej jak Core Data, jest trudne.
W przypadku danych strukturalnych, takich jak adresy, prawie zawsze łatwiej jest poświęcić czas na jawne modelowanie jednostek (np. Atrybut dla każdej części adresu). Oprócz unikania całego dodatkowego kodu do modelowania słownika, sprawia to, że interfejs użytkownika jest łatwiejszy (powiązania „po prostu działają”), a logika walidacji itp. Jest znacznie bardziej przejrzysta, ponieważ większość z nich może być obsługiwana przez Core Data.
Aktualizacja
Począwszy od systemu OS X 10.7, dane podstawowe zawierają uporządkowany typ zestawu, którego można użyć zamiast tablicy. Jeśli możesz kierować reklamy na wersję 10.7 lub nowszą, jest to najlepsze rozwiązanie dla uporządkowanych (przypominających tablicę) kolekcji.
źródło
Miałem podobny problem. W moim przypadku chciałem zmapować tablicę ciągów. Postępowałem zgodnie z radą Barry'ego i wreszcie udało mi się to. Oto, jak wygląda część kodu (co, miejmy nadzieję, wyjaśni sprawę każdemu, kto na to wpadnie) ...
Moja jednostka wygląda mniej więcej tak:
Kod mojego Manage Object Model Code (Core Data) wygląda mniej więcej tak:
Oto kluczowe elementy:
źródło