2010-10-11 15 views
10

Tengo algunos problemas iniciales con coredata, pero creo que eso me aclararía mucho si alguien pudiera explicarme algunos casos simples.Cómo almacenar CGRect y otras cosas en los datos centrales

Quiero poner mi modelo en coredata, y en el caso más simple aprovechar la función deshacer/rehacer. La cosa es que todos los ejemplos que veo tienden a almacenar cadenas o enteros. ¿Qué pasa si tengo una clase de la siguiente que quería poner en práctica en los datos básicos (una compuesta por ejemplo):

@interface Badge : NSObject { 

NSString *textForBadge; 
int  badgeValue; 
UIColor *color; 
CGRect rect; 
NSMutableArray *awards; // this would be a list of 'Category' - another custom class 
} 

Estos son todos hechos en el acto, pero cada uno resaltar una confusión

Tal como lo veo, abriría el modelo .xcdata y agregaría una nueva entidad llamada 'Badge', que sería NSManagedObject. A continuación, agrego una propiedad para textForBadge del tipo String. Hasta aquí todo bien. Hago algo similar para badgeValue, pero luego llego al UIColor y CGRect y estoy un poco perplejo, ya que no hay una propiedad para ellos. ¿Se supone que debo crear una entidad para representar cada una (es decir, una entidad Rect que tiene cuatro propiedades x,y,w,h) que son ints? A continuación, rellene un CGRect con estas entradas cada vez. Lo mismo ocurre con el UIColor?

Finalmente, llego a mi lista de awards. Si se trata de una lista de punteros a una serie de objetos que representan un premio, pueden contener una imagen, un color, texto, etc. Supongo que award volvería a ser una entidad que tengo que diseñar y en lugar de Badge almacenar una matriz que tendría una relación de 1 a muchos de ella a la clase Award.

¿Estoy haciendo algo de esto bien o yendo en la dirección opuesta? Todos los ejemplos que veo operan en objetos estándar como String o int, así que quiero asegurarme de tener esto en mente antes de implementar un montón de cosas.

Saludos cordiales,

Bryn

Respuesta

5

Esta es la documentación pertinente: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html pero en esencia, usted tiene que proporcionar una manera para datos básicos para traducir entre sus propiedades no estándar y los tipos de cosas que puede almacenar. Hay dos maneras de hacerlo. Utilice atributos transformables y transformadores de valores, o use propiedades transitorias y realice la conversión solo cuando se guarde el contexto del objeto gestionado.

Creo que en la mayoría de los casos, lo que describes (definir entidades personalizadas para almacenar los componentes de algo así como un CGRect) es excesivo.

+1

El enlace al que ha hecho referencia aquí está muerto. @AndrewMadsen –

22

Específicamente con respecto CGRect puede utilizar NSStringFromCGRect tienda de un CGRect como NSString. A continuación, utilice CGRectFromString a convertir de nuevo:

CGRect rect = CGRectMake(5, 5, 40, 30); 
NSString* rectAsString = NSStringFromCGRect(rect); 
CGRect original = CGRectFromString(rectAsString); 

Esto le permite almacenar fácilmente en una NSManagedObject. continuación, puede agregar un descriptor de acceso personalizado en su aplicación para convertirlo:

- (CGRect)realRect { 
    return CGRectFromString(self.rectAsString); 
} 
+0

¡Esto es bueno! Gracias –

9

Usted tiene que tener cuidado si se utiliza la serialización NSStringFromCGRect sugerido por aegzorz. Esto no funciona de manera confiable para números grandes que se abrevian en la representación de NSString.

Por ejemplo, este código

CGRect test1 = CGRectMake(CGFLOAT_MAX, CGFLOAT_MAX, CGFLOAT_MAX, CGFLOAT_MAX); 
NSString* test1Str = NSStringFromCGRect(test1); 
CGRect test2 = CGRectFromString(test1Str); 
NSLog(@"test1: %f %f %f %f", test1.origin.x - CGFLOAT_MAX, test1.origin.y - CGFLOAT_MAX, test1.size.width - CGFLOAT_MAX, test1.size.height - CGFLOAT_MAX); 
NSLog(@"test2: %f %f %f %f", test2.origin.x - CGFLOAT_MAX, test2.origin.y - CGFLOAT_MAX, test2.size.width - CGFLOAT_MAX, test2.size.height - CGFLOAT_MAX); 

es la salida

test1: 0.000000 0.000000 0.000000 0.000000 
test2: -344800963262078397207103271862272.000000 -344800963262078397207103271862272.000000 -344800963262078397207103271862272.000000 -344800963262078397207103271862272.000000 

En mi opinión, es mejor almacenar los cuatro valores por separado.

16

Almacenamiento de objetos y estructuras UIColor como CGRect de datos básicos es bastante fácil (esto puede ser nuevo ya que el OP preguntó al respecto):

Definir los objetos como transformable en su modelo:

snapshot of Core Data model

En las clases NSManagedObject definir y utilizar objetos normalmente UIColor:

@property (nonatomic, retain) UIColor *foreground; 

textView.textColor = element.foreground; 

Wrap CGRect str ucturas en un objeto NSValue:

@property (nonatomic, retain) NSValue *imageRect; 

CGRect imageRect = [self.imageRect CGRectValue]; 
imageRect.size.width = 100; 
self.imageRect = [NSValue valueWithCGRect:imageRect]; 
+0

Esta es la forma recomendada de hacer este tipo de cosas – Jack

Cuestiones relacionadas