2010-12-28 10 views
3

Je développe une application qui permet à l'utilisateur d'enregistrer des vidéos et des photos. Maintenant, je me demande quelle est la meilleure façon de les stocker?Stocker des photos et vidéos dans des données de base?

La première idée est bien sûr de l'enregistrer dans la photothèque de l'utilisateur, comme s'il avait enregistré la photo depuis l'application Appareil photo, et d'utiliser une référence aux fichiers. Maintenant, il y a le problème que l'utilisateur peut accéder et supprimer des fichiers de l'application Photos, qui peuvent être encore nécessaires par mon application. Je ne pense pas que je puisse empêcher l'utilisateur de supprimer des photos, mais comment faire face à l'incohérence de mon application?
L'autre façon serait de prendre soin du stockage moi-même. Mon application utilise déjà les données de base, donc je pourrais convertir les fichiers multimédias en utilisant un NSValueTransformer en un objet NSData et le stocker comme BLOB dans les données de base. Ensuite, il y a d'autres questions concernant la performance. Je sais qu'un Core Data basé sur SQLite peut parfaitement gérer des bases de données de plusieurs Go, mais le chargement de gros objets de données prendra quand même un peu de temps. L'avantage évident est que l'utilisateur ne va pas rendre mon application incohérente, mais la pénalité de performance est-elle acceptable? Et surtout: Si j'utilise un UIImagePickerController pour capturer des photos et des vidéos, il va quand même l'enregistrer dans la bibliothèque. Pour l'enregistrer dans Core Data, je devrais prendre la photo à partir de là, la convertir en objet NSData, l'enregistrer et la supprimer à nouveau de la bibliothèque. Cela ne semble pas être la bonne façon pour moi. En outre, UIKit me fournit une fonction pour obtenir un NSData objet d'une photo via UIImageJPEGRepresentation(), mais il ne semble pas y avoir une telle fonction pour la conversion de vidéos. Dans l'ensemble, en raison de toutes ces questions sans réponse, je voudrais utiliser la première approche. Mais le problème d'incohérence me laisse perplexe. Quelle est la meilleure pratique pour y faire face?

+0

Voir ma réponse dans: http://stackoverflow.com/questions/10222632/can-i-access-the-files-used-for-external-binary-storage-in-core-data/13497992#13497992 I est venu 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. –

Répondre

9

Pour la photo:

UIImagePickerController va nous retourner un UIImage dans la mémoire, de sorte que vous n'auriez pas à quoi que ce soit, sans le sortir de la bibliothèque de photos de l'utilisateur et l'enregistrer dans vos données de base ...

pour la vidéo: Vous pouvez prendre les données à l'aide NSData *data = [NSData dataWithContentsOfFile:] ou [NSData dataWithContentsOfUrl:] pour obtenir l'objet NSData de la vidéo. Vous pouvez obtenir le videoUrl facilement

Donc, je viens de corriger certaines de vos mauvaises hypothèses en premier.

Vous n'avez pas besoin de l'enregistrer directement dans CoreData. Vous pouvez l'enregistrer dans le dossier de documents de votre application et les utilisateurs ne pourront plus le supprimer. De plus, sauvegarder dans le dossier des documents de l'application et sauvegarder uniquement le lien vers CoreData permettra également à votre âme de ne plus manipuler l'objet Big Data.

Le problème peut être que vous devez gérer votre stockage de fichiers.

Je ne pense pas qu'il existe une meilleure pratique ici.

Enregistrement dans la bibliothèque de photos de l'utilisateur va aider les utilisateurs voir leurs photos et vidéos plus facile sans accès à votre application

économie en CoreData peut être plus facile pour vous et peut-être plus rapide temps

Enregistrement dans le stockage de fichiers peut vous aider à ne pas traiter un problème binaire lors du chargement de la vidéo parce que Apple MPMoviePlayerController peut vous aider à

pour moi, parce que je ne l'utilise beaucoup SQLite et Core Data, je choisis de stocker dans le système de fichiers

1

Utilisez les données de code pour stocker des images et des gros fichiers. Les données de code peuvent enregistrer des données binaires sur le disque pour vous automatiquement, il suffit de définir cette option sur les propriétés de l'attribut, il suffit d'activer l'option pour autoriser le stockage externe et Core Data fera la magie pour vous, aussi simple que cette.

enter image description here

Ici vous êtes la fonction à faire dans swift3

//Image 
let imageData = UIImageJPEGRepresentation(image, 1) // You can low compression up to >0 

//Video from URL 
let videoData = NSData(contentsOf:videoURL!) 

Son si simple! iOs programmation douce.

Questions connexes