2010-10-11 8 views
10

Ho alcuni problemi iniziali con i coredati, ma ritengo che chiarirebbe le cose per me se qualcuno potesse spiegarmi alcuni casi semplici.Come archiviare CGRect e altre cose nei dati di base

Desidero inserire il mio modello in coredata e, in un caso molto semplice, sfruttare l'annullamento/ripristino. Il fatto è che tutti gli esempi che vedo tendono a memorizzare stringhe o interi. E se ho una classe come segue che ho voluto realizzare nei dati di base (un composto esempio):

@interface Badge : NSObject { 

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

Questi sono tutti costituiti sul posto, ma ogni evidenziare una confusione

A mio avviso, aprirò il .xcdatamodel e aggiungerò un nuovo "Badge" di entità, che sarebbe un NSManagedObject. Quindi aggiungo una proprietà per textForBadge di tipo String. Fin qui tutto bene. Faccio qualcosa di simile per badgeValue, ma poi arrivo allo UIColor e allo CGRect e sono un po 'perplesso, poiché non c'è una proprietà per quelli. Dovrei creare un'entità per rappresentare ciascuna (cioè un'entità Rect con quattro proprietà x,y,w,h) che sono ints? Quindi popola un CGRect con questi inte ogni volta? Idem per l'UIColor?

Infine, vengo alla mia lista di awards. Se questi sono un elenco di puntatori a un numero di oggetti che rappresentano un premio potrebbero contenere un'immagine, un colore, un testo ecc. Suppongo che award sia di nuovo un'entità che devo progettare e piuttosto che Badge che memorizza un array che avrei una relazione da 1 a molti da essa alla classe Award.

Sto ottenendo qualcosa di giusto, o andando nella direzione opposta? Tutti gli esempi che vedo operano su oggetti vanilla come String o int, quindi voglio assicurarmi di averlo in mente prima di implementare un sacco di cose.

Cordiali saluti,

Bryn

risposta

5

Questa è la relativa documentazione: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html ma essenzialmente, è necessario fornire un modo per Core Data per tradurre tra le proprietà non standard e il tipo di cose che può negozio. Ci sono due modi per farlo. Utilizzare attributi trasformabili e trasformatori di valori oppure utilizzare proprietà transitorie e effettuare la conversione solo quando il contesto dell'oggetto gestito verrà salvato.

Penso che nella maggior parte dei casi, ciò che descrivi (definire entità personalizzate per memorizzare i componenti di qualcosa come un CGRect) è eccessivo.

+1

Il link che hai indicato qui è morto. @AndrewMadsen –

22

In particolare per CGRect è possibile utilizzare NSStringFromCGRect memorizzare uno CGRect come NSString. Quindi utilizzare CGRectFromString per riconvertirlo: si

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

Questo permette di memorizzare facilmente in un NSManagedObject. È quindi possibile aggiungere un accesso personalizzato nella realizzazione di convertirlo:

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

Questo è bello! Grazie –

9

bisogna essere attenti se si utilizza la serializzazione NSStringFromCGRect suggerito da aegzorz. Questo non funziona in modo affidabile per i grandi numeri che vengono abbreviati nella rappresentazione NSString.

Ad esempio, questo codice

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); 

uscita volontà

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

A mio parere è meglio memorizzare i quattro valori separatamente.

16

Memorizzazione di oggetti e strutture UIColor come CGRect in Core Data è abbastanza facile (puo 'essere nuovo in quanto l'OP ha chiesto su di esso):

Definire gli oggetti come trasformabile nel modello:

snapshot of Core Data model

Nelle classi NSManagedObject definire e utilizzare UIColor oggetti normalmente:

@property (nonatomic, retain) UIColor *foreground; 

textView.textColor = element.foreground; 

Wrap CGRect str uctures in un oggetto NSValue:

@property (nonatomic, retain) NSValue *imageRect; 

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

Questo è il modo consigliato per fare questo genere di cose – Jack

Problemi correlati