Найкраща практика? - Масив / словник як основний атрибут суб'єкта даних [закрито]


176

Я новачок у Основних даних. Я помітив, що типи колекцій недоступні як типи атрибутів, і хотів би знати, який найефективніший спосіб зберігання даних типу масиву / словника як атрибуту (наприклад, елементи, що складають адресу, наприклад, вулиця, місто тощо). не потребують окремої сутності і зручніше зберігатись як словник / масив, ніж окремі атрибути / поля). Дякую.


6
Створення сутності з рядковими полями для адреси, ймовірно, простіше у використанні, ніж словник, де вам потрібно запам’ятати свої ключі ...
Даніель,

Відповіді:


247

У "Основних даних" немає "рідного" масиву чи типу словника. Ви можете зберігати NSArrayабо NSDictionaryяк атрибут, що перетворюється. Це використовуватиме NSCodingсеріалізацію масиву чи словника до NSDataатрибуту (та належним чином дезаріалізувати його при доступі). Перевага такого підходу полягає в тому, що це легко. Мінус полягає в тому, що ви не можете запитувати в масив чи словник (він зберігається як BLOB у сховищі даних), і якщо колекції є великими, можливо, вам доведеться перемістити багато даних у / із сховища даних (якщо це сховище даних SQLite) просто для читання або зміни невеликої частини колекції.

Альтернативою є використання базових відносин Core Data для багатьох моделей семантики масиву або колекції словників. Масиви простіші, тому давайте почнемо з цього. Взаємозв'язки "Основні дані" для багатьох дійсно моделюють набір, тому якщо вам потрібна функція, схожа на масив, вам доведеться або сортувати набір (використання вилученого властивості - це зручний спосіб зробити це), або додати додатковий атрибут індексу сутності що зберігає елементи масиву та керує індексами самостійно. Якщо ви зберігаєте однорідний масив (усі записи одного типу), легко моделювати опис сутності для об'єктів масиву. Якщо ні, то вам доведеться вирішити, чи використовувати атрибут, що трансформується, для зберігання даних про об'єкт або створення сімейства об'єктів елементів.

Моделювання словника, ймовірно, потребуватиме багато відношення до набору сутностей, що зберігає ключ і значення. І ключ, і значення аналогічні об'єкту елемента для масиву, описаному вище. Таким чином вони можуть бути або власними типами (якщо ви їх знаєте достроково), атрибутом, що перетворюється, або відношенням до екземпляра з родини сукупностей, характерних для типу.

Якщо все це звучить трохи непросто, це так. Встановлення довільних даних у схему, залежну від схеми, як Core Data, є жорсткою.

Для структурованих даних, таких як адреси, майже завжди простіше витратити час на чітке моделювання об'єктів (наприклад, атрибут для кожної частини адреси). Окрім уникнення всього зайвого коду для моделювання словника, це полегшує ваш інтерфейс користувача (прив’язки будуть просто працювати), а логіка валідації тощо набагато чіткіше, оскільки велика частина з них може оброблятися основними даними.

Оновлення

Станом на ОС X 10.7, Основні дані включають впорядкований тип набору, який можна використовувати замість масиву. Якщо ви можете націлити на 10.7 або новішої версії, це найкраще рішення для упорядкованих (схожих на масив) колекцій.


Вторинне - підтвердило те, що я вже думав, але я не знав про атрибути, що перетворюються.
jkp

3
@pixelfreak Використання трансформованого залежить від того, яким чином потрібно використовувати предмети колекції. Якщо вам потрібно здійснити запит проти них, або ви хочете ледаче завантажити деякі або всі з них, атрибут, що перетворюється, не працюватиме. Якщо вам не потрібно ледаче завантажувати, не потрібно проводити запити і завжди потрібні всі елементи або жоден, атрибут, що перетворюється, може працювати для вас (і це, звичайно, легко реалізувати).
Barry Wark

3
Те, що говорить Баррі, більш докладно описано в Посібнику з програмування основних даних, розділ Нестандартні стійкі атрибути .
Палімондо

2
Примітка обережності щодо впорядкованих наборів: не використовуйте їх для безлічі відносин з більш ніж парою тисяч об'єктів з багатьох сторін. Якщо це зробити, збереження може почати тривати так довго, що блокує нитку.
Кірк ван Горком

2
Я не розумію про "новий замовлений набір". Це атрибут? Тому що я не бачу його в меню типу атрибутів.
Сюжет

11

У мене було подібне питання. У моєму випадку я хотів зіставити масив рядків. Я дотримувався поради Баррі і, нарешті, спрацював. Ось як виглядає деякий код (який, сподіваємось, прояснить речі для всіх, хто натрапив на це) ...

Моя сутність виглядає приблизно так:

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

Код "Моє управління об'єктною моделлю" (основні дані) виглядає приблизно так:

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];

Отож, основними пунктами тут є:

  • Я використовую NSSet для типу властивості
  • Я використовую NSTransformableAttributeType як тип атрибута в Основній моделі об'єкта керованих даних.

Отже, ви б помістили цей код всередину методу ініціативи AptribuSearchResponse.m?
Chicowitz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.