Eu sou novo no Core Data. Percebi que os tipos de coleção não estão disponíveis como tipos de atributo e gostaria de saber qual é a maneira mais eficiente de armazenar dados de tipo de matriz / dicionário como um atributo (por exemplo, os elementos que compõem um endereço como rua, cidade etc. não requer uma entidade separada e é mais convenientemente armazenada como um dicionário / matriz do que atributos / campos separados). Obrigado.
objective-c
ios
core-data
nsarray
nsdictionary
RunLoop
fonte
fonte
Respostas:
Não há matriz "nativa" ou tipo de dicionário no Core Data. Você pode armazenar um
NSArray
ou umNSDictionary
atributo como transformável. Isso usará oNSCoding
para serializar a matriz ou dicionário para umNSData
atributo (e desserializar adequadamente após o acesso). A vantagem dessa abordagem é que é fácil. A desvantagem é que você não pode consultar a matriz ou o dicionário (ele é armazenado como um BLOB no repositório de dados) e, se as coleções forem grandes, poderá ser necessário mover muitos dados para / do repositório de dados (se for um armazenamento de dados SQLite) apenas para ler ou modificar uma pequena parte da coleção.A alternativa é usar os relacionamentos Core Data para muitos para modelar a semântica da matriz ou coleção de dicionário. As matrizes são mais fáceis, então vamos começar com isso. Os relacionamentos Core Data para muitos estão realmente modelando um conjunto; portanto, se você precisar de uma funcionalidade semelhante a uma matriz, terá que classificar o conjunto (usar uma propriedade buscada é uma maneira conveniente de fazer isso) ou adicionar um atributo de índice extra à entidade que armazena os itens da matriz e gerencia você mesmo os índices. Se você estiver armazenando uma matriz homogênea (todas as entradas são do mesmo tipo), é fácil modelar a descrição da entidade para as entidades da matriz. Caso contrário, você terá que decidir se deseja usar um atributo transformável para armazenar os dados do item ou criar uma família de entidades do item.
A modelagem de um dicionário provavelmente exigirá uma relação de muitos com um conjunto de entidades que armazena uma chave e um valor. Tanto a chave quanto o valor são análogos à entidade do item para a matriz, descrita acima. Portanto, eles podem ser tipos nativos (se você os conhecer com antecedência), um atributo transformável ou um relacionamento com uma instância de uma família de entidades específicas do tipo.
Se tudo isso parece um pouco assustador, é. Colocar dados arbitrários em uma estrutura dependente de esquema como o Core Data é difícil.
Para dados estruturados, como endereços, é quase sempre mais fácil gastar o tempo modelando explicitamente as entidades (por exemplo, um atributo para cada parte do endereço). Além de evitar todo o código extra para modelar um dicionário, isso facilita a interface do usuário (as ligações "funcionarão") e a lógica de validação etc. muito mais clara, pois grande parte dele pode ser manipulada pelo Core Data.
Atualizar
No OS X 10.7, o Core Data inclui um tipo de conjunto ordenado que pode ser usado no lugar de uma matriz. Se você pode segmentar 10.7 ou posterior, esta é a melhor solução para coleções ordenadas (do tipo matriz).
fonte
Eu tive uma questão semelhante. No meu caso, eu queria mapear uma matriz de strings. Eu segui o conselho de Barry e finalmente o fiz funcionar. Aqui está a aparência de alguns códigos (que esperamos esclarecer as coisas para qualquer pessoa que se depare com isso) ...
Minha entidade é mais ou menos assim:
Meu código Manage Code Model Model (Core Data) é mais ou menos assim:
Portanto, os itens principais aqui são:
fonte