ios - NSDictionary y Core Data
core-data iphonecoredatarecipes (4)
Cambie el tipo de atributo a Transformable
.
Si está utilizando mogenerator (muy bien debería), el tipo predeterminado generado para un transformable es id
.
Para que mogenerator genere el tipo específico NSDictionary
, puede agregar una clave personalizada attributeValueClassName
con el valor NSDictionary
para el atributo. Consulte esta captura de pantalla .
Por favor, estoy tratando de obtener un poco de conocimiento en los datos básicos. Hasta ahora me he acostumbrado a crear entidades y agregar, recuperar y eliminar valores de esta entidad.
Mi pregunta es la siguiente. ¿Cuáles son las formas posibles de almacenar propiedades de NSDictionary
en una entidad cuando se utilizan datos centrales?
Hay varias formas de abordar esto:
a. Cree una entidad que sea representativa de NSDictionary, de modo que cada clave de diccionario esté representada por un atributo de entidad.
segundo. Si no le gusta el enfoque anterior en el que crea una entidad separada, aún puede almacenar el NSDictionary en un único campo de datos principales de tipo NSData, siempre que serialice NSDictionary a NSData primero.
//NSDictionary to NSData
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:dictionary forKey:@"Some Key Value"];
[archiver finishEncoding];
// data is now ready to use
También necesitarás convertir el NSData a NSDictionary cuando lo leas desde Core Data.
// NSData to NSDictionary
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
NSDictionary *dictionary = [[unarchiver decodeObjectForKey:@"Some Key Value"] retain];
[unarchiver finishDecoding];
// dictionary is now ready to use
do. Finalmente, puede usar un marco persistente como Sensible TableView, donde todas sus estructuras de datos se recuperan, visualizan y guardan automáticamente. Me ahorra una tonelada de código.
Tengo una solución alternativa para eso, simplemente guarde el dictionaryObj.description
en String en Core Data y mientras recupero la cadena de diccionario, puede convertirlo en diccionario
-(NSMutableDictionary *)getMetaDataDictionary:(NSString *)string
{
NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding];
NSPropertyListFormat format;
NSMutableDictionary * metaDataDictionary;
@try
{
NSError * error;
metaDataDictionary = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListImmutable
format:&format
error:&error];
if(!metaDataDictionary)
{
NSLog(@"ERROR: COULD NOT PARSE META-DATA : %@", error.description);
}
}
@catch(NSException * exp)
{
NSLog(@"DICTIONARY :: %@", exp.description);
}
return metaDataDictionary;
}
deberías usar "Atributos Transformables":
- abrir el archivo
*.xcdatamodeld
- entidad seleccionada
- agregar atributo (nombrarlo, por ejemplo, " información ") y establecer el tipo como " Transformable "
- generar archivos de subclase
NSManagedObject
apropiados (NSManagedObject
> Nuevo-> Archivo ... SubclaseNSManagedObject
) - abra
*.h
archivo y cambie el tipo de propiedad " información " de id a NSMutableDictionary *
todo lo demás funciona automáticamente
para obtener más información, consulte: https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html