Tengo un gráfico de objetos de datos centrales (que consta de dos entidades vinculadas por una relación a muchos).
Como desarrollador de iPhone relativamente inexperto, tenía curiosidad por saber si alguien podría recomendar un enfoque y una implementación JSON adecuada para el iPhone, que me permitiría:
convertir los registros de datos centrales en una cadena JSON (manteniendo la relación entre las entidades); y
convierta la cadena JSON nuevamente en objetos de datos centrales (nuevamente preservando la relación entre entidades).
He buscado, sin éxito, un tutorial / ejemplo de código sobre este punto, por lo que cualquier ayuda sería recibida con gratitud.
iphone
objective-c
json
core-data
Urizen
fuente
fuente
NSJSONSerialization
developer.apple.com/library/mac/#documentation/Foundation/… stackoverflow.com/questions/6726899/nsjsonserialization-in-ios5Respuestas:
Primero, elija una biblioteca JSON para usar, personalmente me gusta TouchJSON, pero varias otras también son bastante buenas. La parte complicada, aunque no muy difícil, es convertir sus objetos gestionados en estructuras adecuadas para la conversión. Escribí esto muy rápido, por lo que puede tener un error o dos :)
Los métodos que llamas son:
Y la implementación es la siguiente:
Ahora bien, esto es recursivo, por lo que puede terminar fácilmente traduciendo todo su almacén persistente si no tiene cuidado. Observe sus relaciones y asegúrese de que solo "bajen" en el árbol de objetos para que solo obtenga los objetos que desea traducir.
fuente
Solo quería señalar un pequeño error tipográfico que provocó que el código se bloqueara y, con suerte, esto le ahorrará unos minutos.
los
NSMutableArray *dataArray = [[NSArray alloc] init]; // This should be NSMutableArray
realmente debería ser
NSMutableArray *dataArray = [[NSMutableArray alloc] init];
eso es todo.
gracias
fuente
Sincronización de datos centrales con rieles es una presentación detallada que incluye código de muestra para serializar / deserializar sus objetos Core Data a / desde JSON (pase a la diapositiva 55 para la parte Core Data). Su código de muestra asume un modelo bastante simple sin relaciones, aunque creo que sería bastante fácil de ampliar.
La presentación también incluye algunos detalles sobre cómo mantener su modelo de datos básicos sincronizado con una aplicación web basada en REST, con indicaciones a algunas bibliotecas útiles, incluidas ObjectiveResource y ASIHTTPRequest . No estoy seguro de si eso es lo que está tratando de hacer, pero vale la pena echarle un vistazo incluso al código Core Data.
fuente
Si tiene un
NSDate
en su objeto administrado, como se mencionó anteriormente en uno de los comentarios, tendrá problemas para serializar el objeto que contiene elNSDate
. Una solución simple es agregar unJSONDataRepresentation
método aNSDate
usar categorías de objetivo-c.Agregue estos dos archivos a su proyecto:
NSdate.h:
NSDate.m:
fuente
Hay una biblioteca que realiza la sincronización JSON por usted: https://github.com/sixdegrees/lidenbrock
fuente
Encontré esta publicación que funciona muy bien.
http://touchalicious.com/blog/2009/10/25/turn-core-data-models-into-json.html
Dado que esto es recursivo, las relaciones de muchos a muchos seguirán circulando por sí mismas. Para evitar esto, agregué una clave "isExportable" al diccionario de información del usuario de las relaciones en mi modelo Core Data. Luego puede verificar esta clave y elegir no recorrer las relaciones sin ella.
fuente
Solo pensé en publicar una actualización rápida de esta pregunta. Seguí las Respuestas de Marcus y Brandon y se me ocurrió esto para la exportación JSON (todavía usa TouchJSON):
No pude hacer que la importación funcionara, tal vez eso tenga algo que ver con el hecho de que estoy usando Magical Record, no estoy seguro, así que simplemente estoy recorriendo el flujo JSON entrante y creando objetos manualmente ...
fuente
Marcus S. Zarra me ha inspirado a llevar la idea recursiva a una versión funcional. En esta versión, no necesita establecer una clave en CoreData y puede cortarla y pegarla en su proyecto :-)
La clave aquí es pasar la entidad padre como argumento a la recursividad, para que podamos decidir qué relación tenemos que llenar con datos. Entonces, ambas funciones:
dataStructureFromManagedObject
ymanagedObjectFromStructure
pueden codificar y decodificar cualquier objeto de entidad de CoreData en un diccionario y de nuevo en un objeto.fuente