2010-01-25 6 views
6

Je me demande si c'est un choix judicieux de stocker des images avec des données de base dans la propriété binaireCoreData (pour iPhone) stockant des images

dire que j'ai une collection de films et je veux sauver la jaquette du DVD d'image dans une propriété de la taille avg d'une couverture est de 20/30ko (320x480px)

la raison pour laquelle je veux faire est la gestion du stockage, une fois que je supprimer le film je sais que l'image est également supprimé

Je ne suis pas tout à fait sûr si c'est une bonne idée, charge de données, vitesse?

quelqu'un a de l'expérience avec cela?

+0

Ceci est une copie de http://stackoverflow.com/questions/1168954/storing-large-eg-image-fichiers-de-movie-dans-les-data-sur-le-iphone et http: // stackoverflow. com/questions/2090028/core-data-stockage-images-iphone –

Répondre

11

Il me semble que stocker des images dans une base de données n'est pas une bonne idée, et je suis sûr que je l'ai également lu sur l'un des guides de programmation d'Apple. Considérez simplement ceci, quand vous récupérerez votre collection, toutes les images seront également chargées en mémoire, même si vous n'affichez que 8 images, votre collection entière d'image sera chargée par des données de base.

Si vous voulez vous assurer que vous supprimez les fichiers d'image lorsqu'un enregistrement de mouvement a été supprimé, je vous propose d'écouter les notifications par le managedObjectContext et supprimer des fichiers lorsqu'un film a été supprimé:

Vous pouvez vous inscrire au willSave ou notSave notification, chacun avec ses propres avantages/inconvénients.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:) name:NSManagedObjectContextDidSaveNotification object:managedObjectContext]; 

Obtenir les objets supprimés:

- (void) contextDidSave:(NSNotification *)notification 
{ 
    NSDictionary *userInfo = [notification userInfo]; 
    for (NSManagedObject *currObject in [userInfo objectForKey:NSDeletedObjectsKey]) 
    { 
     // Code for deleting file associated with the NSManagedObject, you can still 
     // access the managed object's properties. 
    } 
} 
+2

Il n'y a rien de mal à stocker des données binaires dans les données de base, en particulier des tailles d'image avec lesquelles l'OP travaille. Passez en revue les deux liens affichés en note à la question. Tout élément inférieur à 100 Ko peut facilement être stocké directement dans les données de base. –

+1

Bien sûr, cela peut être fait, mais à mon avis ce n'est pas la meilleure façon de le faire, sauf si vous pouvez contrôler si les données binaires sont effectivement récupérées et chargées en mémoire. Sinon, la récupération de 100 enregistrements chargera 2/3mb dans la mémoire sans aucune raison. –

+0

De préférence, stockez simplement les chemins de fichiers sous forme de chaînes dans coredata et chargez-les de cette façon? – powerj1984

1

Il me est apparu que vous pouvez utiliser une autre approche qui pourrait être mieux si vous êtes déjà NSManagedObject pour votre sous-classement entité film.

Vous pouvez implémenter la méthode didSave ou willSave sur NSManagedObject et vérifier la propriété isDeleted. Si elle est supprimée, supprimez l'image du disque.

7

La meilleure méthode consiste à stocker le chemin d'accès à l'image dans l'objet géré, puis à supprimer le fichier dans la méthode prepareForDeletion de l'objet.

0

Voir ma réponse:

Can I access the files used for external binary storage in Core Data?

Vous pouvez stocker des fichiers volumineux dans les données de base en utilisant maintenant le « Permet de stockage externe » option. Le seul problème avec ceci n'est plus d'avoir accès aux fichiers réels par chemin, seulement les données binaires pures. Je suis arrivé avec une solution "créative" (si la meilleure pratique est anyones), mais cela vous permettra d'utiliser Core Data pour gérer vos fichiers tout en étant capable d'accéder aux fichiers REAL par leur chemin.