web-dev-qa-db-fra.com

Données de base - Stockage d'images (iPhone)

J'ai une application où j'autorise l'utilisateur à ajouter une image pour son compte.

Je souhaite savoir comment stocker une image (obtenue à partir de l'appareil photo ou de la photothèque) en utilisant Core Data, car je peux offrir une fonction de sauvegarde à l'utilisateur et chercherais à transférer les données d'image vers un serveur.

Je suis tombé sur la suggestion de conception de créer un objet modèle Image et de créer une relation 1 à 1 avec l'objet modèle User (afin que l'objet Image associé ne soit pas appelé sauf si requis) ). Cependant, je ne sais pas comment stocker pratiquement l'image et si cela est potentiellement fatal en termes de performances.

Je serais reconnaissant pour tout conseil sur l'approche et les pièges de quiconque a tenté cela.

46
Urizen

La règle de stockage des données d'image dans Core Data est la suivante:

  • <100 ko de stockage dans l'entité liée (personne, adresse, etc.).
  • <1 Mo de stockage dans une entité distincte à l'autre extrémité d'une relation pour éviter les problèmes de performances.
  • 1 Mo de stockage sur le disque et référencez le chemin d'accès dans votre magasin de données de base.

Vous pouvez utiliser le type de données transformable pour stocker le NSImage directement dans Core Data. En fait, vous pouvez utiliser le type de données transformable pour stocker tout ce qui implémente le protocole NSCoder.

Personnellement, je ne le convertirais pas en CGImageRef car vous pourriez perdre beaucoup d'informations de cette façon.

84
Marcus S. Zarra

Le temps a passé depuis que cette question a été posée, mais je veux partager mon expérience sur cette question.


Je ne vous recommanderais pas de stocker des images dans votre base de données si leur nombre n'est pas limité. Vous devez garder à l'esprit qu'un jour vous ajouterez une nouvelle version du modèle de données et que vous devrez migrer de l'ancienne base de données vers une nouvelle lors de la mise à jour de l'application. Ça prend du temps. Plus votre fichier DB est volumineux, plus il faut de temps pour migrer.

Si vous souhaitez stocker des images dans DB, assurez-vous de ne pas ajouter de stockage persistant dans application: didFinishLaunchingWithOptions: méthode de UIApplicationDelegate. iOS mettra fin à votre application si la migration ne se termine pas dans XX secondes.

29
Eldar Markov

Piège: vous pouvez vous retrouver avec une énorme base de données sqlite difficile à gérer. Voulez-vous vraiment que vos utilisateurs téléchargent un fichier de plusieurs Mo en une seule étape sur le serveur? Que faites-vous si la connexion celluar tombe en panne pendant quelques secondes?

Je pense que ce serait mieux si vous utilisez Core Data pour gérer vos images et leur état de téléchargement (téléchargé: oui ou non). De cette façon, vous pouvez télécharger les images, lorsqu'elles s'intègrent dans le flux de travail de votre application. D'accord, cela durera un peu plus longtemps, en raison des nombreuses connexions. Mais c'est une approche plus propre, je pense ...

Lorsque vous pensez à iTunes, lorsque vous parlez de sauvegardes: le dossier "Documents" de votre iPhone local est quand même synchronisé.

4
Stefan

Vous devez avoir un a, alors vous pouvez faire quelque chose comme ceci:

CGImageRef imageRef = uiImage.CGImage;
CGDataProviderRef dataProvider = CGImageGetDataProvider(imageRef);
NSData *imageData = (NSData*)CGDataProviderCopyData(dataProvider);
[managedObject setValue:imageData forKey:@"data"];

Où managedObject est votre objet d'image de données de base et @ "data" est le nom de la propriété binaire. Vous devrez peut-être également enregistrer le format d'image afin de désérialiser l'image ultérieurement.

Une autre option consiste à enregistrer l'image sur le disque et à stocker le chemin dans les données de base.

3
Elfred