46 votes

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

J'ai une application dans laquelle j'permettre à l'utilisateur d'ajouter une image pour leur compte.

Je souhaite savoir comment faire pour enregistrer une image (obtenu à partir de l'appareil photo ou de la bibliothèque) à l'aide de Données de Base, comme je l'ai peut offrir un centre de sauvegarde pour l'utilisateur et serait à la recherche de transférer les données d'image sur un serveur.

Je suis venu à travers la conception de la suggestion de créer un Image modèle objet et de la création d'un 1-de-1 en relation avec l' User modèle objet (de sorte que l'Image associée objet n'est pas appelé, sauf si requis). Cependant, je ne suis pas sûr comment pratiquement stocker l'image et si c'est potentiellement mortelle en termes de performances.

Je vous serais reconnaissant de tout conseil sur l'approche et les pièges de toute personne qui a tenté cela.

84voto

Marcus S. Zarra Points 32178

La règle pour les données d'image sont stockées dans la Base de Données est comme suit:

  • < 100 ko magasin dans l'entité (personne, l'adresse, peu importe).
  • < 1 mb stocker dans une entité distincte sur l'autre extrémité d'une relation afin d'éviter des problèmes de performance.
  • > 1 mo stocker sur le disque de référence et le chemin d'accès à votre Base de Données à stocker.

Vous pouvez utiliser l'transformable type de données à stocker les NSImage directement dans la Base de Données. En fait, vous pouvez utiliser le transformables type de données à stocker quoi que ce soit qui implémente l'NSCoder protocole.

Personnellement, je ne serait pas la convertir en une CGImageRef que vous pouvez perdre beaucoup d'information de cette façon.

29voto

Eldar Markov Points 810

Le temps écoulé depuis que cette question a été posée mais j'ai envie de partager mon expérience sur ce problème.


Je ne vous recommanderais pas de stocker des images à l'intérieur de la DB si leur nombre n'est pas limité. Vous devez toujours vous rappeler qu'un jour vous allez ajouter de nouvelle version du modèle de données et vous aurez à la migration de l'ancienne DB à une nouvelle Application mise à jour. Cela prend du temps. Le plus vous fichier DB est, plus il prend pour migrer.

Si vous voulez stocker les images en DB assurez-vous de ne pas ajouter un stockage permanent en application: didFinishLaunchingWithOptions: méthode de UIApplicationDelegate. iOS va mettre fin à votre application si la migration ne se termine pas dans les 30 secondes.

4voto

Stefan Points 4745

Piège: vous pouvez Vous retrouver énorme, difficile à gérer la base de données sqlite. Voulez-vous vraiment à vos utilisateurs de télécharger un fichier de plusieurs MO en une seule étape, pour le serveur? Que faites-vous, si le celluar sauts de connexion vers le bas pour quelques secondes?

Je pense qu'il serait mieux, si vous utilisez la Base de Données pour gestion de vos images et de leur téléchargement etat (téléchargé: oui ou non). De cette façon, vous pouvez télécharger les images, où il s'intègre dans votre application de flux de travail. Bon, ça va durer un peu plus longtemps, en raison du grand nombre de connexions. Mais c'est un nettoyant approche, je pense...

Quand vous pensez à propos d'iTunes, lorsque l'on parle de sauvegardes: Votre iPhone 'Documents' dossier est synchronisé de toute façon.

3voto

Elfred Points 3395

Vous devriez avoir aaa, 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 image de données principal et @ "data" le nom de la propriété binaire. Vous devrez peut-être également enregistrer le format de l’image afin de la désérialiser ultérieurement.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X