Najlepsza praktyka? - Array / Dictionary jako atrybut core Data Entity [zamknięty]

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 array / dictionary jako atrybutu (np. elementów składających się na adres, takich jak Ulica, Miasto, itp. nie wymaga oddzielnego elementu i jest wygodniej przechowywany jako słownik/tablica niż oddzielne atrybuty / pola). Dziękuję.

Author: RunLoop, 2009-10-14

2 answers

W danych podstawowych nie ma" natywnej " tablicy ani typu słownika. Możesz zapisać NSArray LUB NSDictionary jako atrybut transformowalny. To użyje NSCoding do serializacji tablicy lub słownika do atrybutu NSData (i odpowiednio deserializacji go przy dostępie). Zaletą tego podejścia jest to, że jest to łatwe. Minusem jest to, że nie można wysyłać zapytań do tablicy lub słownika (jest ona przechowywana jako obiekt BLOB w magazynie danych), a jeśli zbiory są duże, być może trzeba będzie przenieść wiele danych do/Z magazyn danych (jeśli jest to magazyn danych SQLite), aby odczytać lub zmodyfikować niewielką część kolekcji.

Alternatywą jest użycie podstawowych danych do wielu relacji do modelowania semantyki tablicy lub zbioru słownika. Tablice są łatwiejsze, więc zacznijmy od tego. Core Data to-many relations są naprawdę modelowaniem zbioru, więc jeśli potrzebujesz funkcji podobnej do tablicy, musisz albo posortować zbiór (używając właściwości fetched jest to wygodny sposób), albo dodać dodatkowy atrybut index do podmiotu, 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 encji dla encji tablicy. Jeśli nie, będziesz musiał zdecydować, czy użyć przekształcalnego atrybutu do przechowywania danych elementu, czy utworzyć rodzinę elementów.

Modelowanie słownika będzie prawdopodobnie wymagało relacji to-many do zbioru jednostek, które przechowują klucz i wartość. Zarówno klucz jak i wartość to analogiczny do encji pozycji dla tablicy, opisanej powyżej. Mogą to być typy natywne( jeśli znasz je wcześniej), atrybut transformowalny lub związek z instancją z rodziny jednostek specyficznych dla danego typu.

Jeśli to brzmi trochę zniechęcająco, to tak. Łączenie dowolnych danych w strukturę zależną od schematu, taką 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 dodatkowego kodu do modelowania słownika, ułatwia to interfejs użytkownika (wiązania będą "po prostu działać") i logikę walidacji itp. znacznie jaśniejsze, ponieważ wiele z nich może być obsługiwane przez Podstawowe Dane.

Update

Począwszy od OS X 10.7, Podstawowe Dane zawierają uporządkowany Typ zestawu, który może być użyty zamiast tablicy. Jeśli możesz celować w 10.7 lub nowszą wersję, jest to najlepsze rozwiązanie dla uporządkowanych (podobnych do tablic) kolekcji.

 241
Author: Barry Wark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-13 12:36:34

Miałem podobny problem. W moim przypadku, chciałem odwzorować szereg ciągów. Posłuchałem Rady Barry ' ego i w końcu to zadziałało. Oto, jak wygląda część kodu (co, miejmy nadzieję, wyjaśni wszystko każdemu, kto na to wpadnie)...

Mój byt wygląda mniej więcej tak:

@interface AppointmentSearchResponse : NSManagedObject
@property (nonatomic, retain) NSSet *messages;
@end

Mój kod modelu zarządzania obiektem (Core Data) wygląda mniej więcej tak:

NSEntityDescription *entityDescription = [[NSEntityDescription alloc] init];
[entityDescription setName:@"AppointmentSearchResponse"];
[entityDescription setManagedObjectClassName:@"AppointmentSearchResponse"];

NSMutableArray *appointmentSearchResponseProperties = [NSMutableArray array];
NSAttributeDescription *messageType = [[NSAttributeDescription alloc] init];    
[messageType setName:@"messages"];
[messageType setAttributeType:NSTransformableAttributeType];
[appointmentSearchResponseProperties addObject:messageType];

[entityDescription setProperties:appointmentSearchResponseProperties];

Więc kluczowe elementy są tutaj:

  • używam NSSet dla nieruchomości typ
  • używam NSTransformableAttributeType jako typu atrybutu w modelu obiektowym zarządzanym przez Core Data.
 11
Author: caleb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-23 22:57:09