В Базовых данных нет «родного» массива или типа словаря. Вы можете сохранить NSArray
или NSDictionary
как трансформируемый атрибут. Это будет использовать NSCoding
для сериализации массива или словаря в NSData
атрибут (и соответственно десериализовать его при доступе). Преимущество такого подхода в том, что это легко. Недостатком является то, что вы не можете выполнять запросы в массив или словарь (он хранится как BLOB-объект в хранилище данных), и если коллекции большие, вам, возможно, придется перенести много данных в / из хранилища данных (если это хранилище данных SQLite) просто для чтения или изменения небольшой части коллекции.
Альтернативой является использование базовых данных для многих отношений для моделирования семантики массива или словарной коллекции. Массивы проще, поэтому давайте начнем с этого. Отношения Базовых Данных со многими на самом деле моделируют набор, поэтому, если вам нужна функциональность, подобная массиву, вы должны либо отсортировать набор (использование этого метода является удобным способом сделать это), либо добавить дополнительный атрибут индекса к объекту. который хранит элементы массива и управляет индексами самостоятельно. Если вы храните однородный массив (все записи одного типа), легко смоделировать описание сущностей для сущностей массива. Если нет, вам придется решить, использовать ли трансформируемый атрибут для хранения данных элемента или создать семейство элементов элемента.
Моделирование словаря, вероятно, потребует отношения ко многим с набором сущностей, в которых хранятся ключ и значение. И ключ, и значение аналогичны сущности элемента для массива, описанного выше. Таким образом, они могут быть родными типами (если вы их знаете заранее), трансформируемым атрибутом или отношением к экземпляру из семейства специфичных для типа объектов.
Если все это звучит немного устрашающе, это так. Сковывать произвольные данные в зависимую от схемы структуру, такую как Core Data, сложно.
Для структурированных данных, таких как адреса, почти всегда проще тратить время на явное моделирование сущностей (например, атрибут для каждой части адреса). Помимо того, что избегается весь дополнительный код для моделирования словаря, это делает ваш пользовательский интерфейс проще (привязки будут «просто работать»), а также логику проверки и т. Д. Намного более понятной, поскольку большая часть этого может обрабатываться Core Data.
Обновить
Начиная с OS X 10.7, Core Data включает тип упорядоченного набора, который можно использовать вместо массива. Если вы можете выбрать 10.7 или более позднюю версию, это лучшее решение для упорядоченных коллекций.