Memorizzare le immagini in un database Core Data è piuttosto semplice. Devi solo contrassegnare l'attributo dell'immagine come trasformabile e creare una sottoclasse di NSValueTransformer. All'interno di questa sottoclasse, aggiungere il codice come il seguente:
+ (Class)transformedValueClass
{
return [NSData class];
}
+ (BOOL)allowsReverseTransformation
{
return YES;
}
- (id)transformedValue:(id)value
{
if (value == nil)
return nil;
// I pass in raw data when generating the image, save that directly to the database
if ([value isKindOfClass:[NSData class]])
return value;
return UIImagePNGRepresentation((UIImage *)value);
}
- (id)reverseTransformedValue:(id)value
{
return [UIImage imageWithData:(NSData *)value];
}
Per l'attributo trasformabile, specificare il nome di questa sottoclasse come il valore Transformer nome.
È possibile quindi creare una sottoclasse NSManagedObject per l'entità che ospita questo attributo immagine e dichiarare una proprietà per questo attributo immagine:
@property(nonatomic, retain) UIImage *thumbnailImage;
si può leggere UIImages e scrivere UIImages a questa proprietà e saranno trasparente cambiato da e verso NSData per essere memorizzato nel database.
La scelta di farlo dipende dal caso specifico. Le immagini più grandi probabilmente non dovrebbero essere archiviate in questo modo, o almeno dovrebbero essere nella loro stessa entità in modo che non vengano recuperate in memoria finché non viene seguita una relazione con loro. Le miniature di piccole dimensioni sono probabilmente perfette per inserire il database in questo modo.
fonte
2010-10-11 18:53:36
Solo un follow-up per chiunque lo verifichi ora: UIImage ora è conforme a NSCoding in iOS 5. Se sei in grado di scegliere come target iOS 5 e versioni successive, puoi semplicemente impostare l'attributo e Trasformabile ed essere fatto. È anche possibile selezionare "Permette l'archiviazione esterna" per far sì che le immagini più grandi vengano salvate automaticamente al di fuori del proprio archivio di Core Data automaticamente. – atticus
Il codice che viene generato automaticamente da CoreData ha ID anziché UIImiage * come attributo. È normale? Dovremmo cambiarlo? –
@JimThio - Giusto, questo è l'impostazione predefinita. Perché so che imposterò una UIImage su questa proprietà trasformata, cambio il tipo in UIImage. Ciò aiuta a mantenere il mio codice chiaro e fornisce un controllo di integrità se cerco di utilizzare questa proprietà nel modo sbagliato. –