Eu tenho um gráfico de objeto de dados principal (consistindo em duas entidades vinculadas por um relacionamento para muitos).
Eu estava curioso, como um desenvolvedor de iPhone relativamente inexperiente, se alguém poderia recomendar uma abordagem e uma implementação JSON adequada para o iPhone, que me permitiria:
converter os registros de dados principais em uma string JSON (enquanto mantém o relacionamento entre as entidades); e
converter a string JSON de volta em objetos de dados centrais (novamente preservando o relacionamento entre as entidades).
Eu procurei, sem sucesso, por um tutorial / amostra de código neste ponto, então qualquer ajuda seria recebida com gratidão.
iphone
objective-c
json
core-data
Urizen
fonte
fonte
NSJSONSerialization
developer.apple.com/library/mac/#documentation/Foundation/… stackoverflow.com/questions/6726899/nsjsonserialization-in-ios5Respostas:
Primeiro, escolha uma biblioteca JSON para usar, eu pessoalmente gosto do TouchJSON, mas várias outras por aí também são muito boas. A parte complicada, embora não muito difícil, é converter seus objetos gerenciados em estruturas adequadas para a conversão. Escrevi isso bem rápido, então pode haver um ou dois erros :)
Os métodos que você chama são:
E a implementação é a seguinte:
Agora, isso é recursivo, então você pode facilmente acabar traduzindo todo o armazenamento persistente se não for cuidadoso. Observe seus relacionamentos e certifique-se de que eles apenas vão "para baixo" na árvore de objetos, de modo que você obtenha apenas os objetos que deseja traduzir.
fonte
Eu só queria apontar um pequeno erro de digitação, que fez com que o código travasse, e espero que isso economize alguns minutos.
o
NSMutableArray *dataArray = [[NSArray alloc] init]; // This should be NSMutableArray
realmente deveria ser
NSMutableArray *dataArray = [[NSMutableArray alloc] init];
isso é tudo.
obrigado
fonte
Sincronizando Core Data with Rails é uma apresentação detalhada que inclui código de amostra para serializar / desserializar seus objetos Core Data para / de JSON (pule para o slide 55 para a parte Core Data). Seu código de amostra assume um modelo bastante simples, sem relacionamentos, embora eu ache que seria muito fácil de estender.
A apresentação também apresenta alguns detalhes sobre como manter seu modelo de dados principais em sincronia com um aplicativo da web baseado em REST, com ponteiros para algumas bibliotecas úteis, incluindo ObjectiveResource e ASIHTTPRequest . Não tenho certeza se é isso que você está tentando fazer, mas vale a pena dar uma olhada até mesmo no código de Core Data.
fonte
Se você tiver um
NSDate
em seu objeto gerenciado, conforme mencionado acima em um dos comentários, terá problemas para serializar o objeto que contém oNSDate
. Uma solução simples é adicionar umJSONDataRepresentation
método paraNSDate
usar categorias objetivas-c.Adicione estes dois arquivos ao seu projeto:
NSdate.h:
NSDate.m:
fonte
Existe uma biblioteca que faz a sincronização JSON para você: https://github.com/sixdegrees/lidenbrock
fonte
Me deparei com este post que funciona muito bem.
http://touchalicious.com/blog/2009/10/25/turn-core-data-models-into-json.html
Como isso é recursivo, os relacionamentos muitos para muitos continuarão se repetindo entre si. Para evitar isso, adicionei uma chave "isExportable" ao dicionário de informações do usuário dos relacionamentos em meu modelo de dados principais. Você pode então verificar essa chave e optar por não percorrer relacionamentos sem ela.
fonte
Só pensei em postar uma atualização rápida para esta questão. Segui as respostas de Marcus e Brandon e vim com isso para exportação JSON (ainda usa TouchJSON):
Não consegui fazer a importação funcionar, talvez isso tenha algo a ver com o fato de que estou usando Magical Record, não tenho certeza, então estou apenas fazendo um loop através do fluxo JSON de entrada e criando objetos manualmente ...
fonte
Marcus S. Zarra me inspirou a trazer a ideia recursiva para uma versão funcional. Nesta versão, você não precisa definir uma chave no CoreData e pode recortar e colá-la em seu projeto :-)
A chave aqui é passar a entidade pai como argumento para a recursão, para que possamos decidir qual relacionamento devemos preencher com os dados. Portanto, as duas funções:
dataStructureFromManagedObject
emanagedObjectFromStructure
podem codificar e decodificar qualquer objeto de entidade de CoreData em um dicionário e de volta em um objeto.fonte