Bindings et stockage des images
idea
Membre
Bonjour
j'ai créé une application qui me sers de base de données pour gérer mes films (dvd et divx). J'utilise coredata et les bindings. J'ai la possibilité de rajouter la jacquette pour chaque film par l'intermédiaire d'un drag and drop sur un NSImageView. J'ai pas de souci a ce niveau la. grace au bindings ca enregistre mes images dans le .xml. Mais le probleme vient du fait que mon xml grossi énormement a chaque ajout d'image. Je suppose qu'il enregistre les images sans les compressé ni rien. Ce que je voudrais pouvoir faire c'est compresser ces images au niveau de l'enregistrement. Faut t'il que je passe par un ValueTransformer spécifique?
Merci
j'ai créé une application qui me sers de base de données pour gérer mes films (dvd et divx). J'utilise coredata et les bindings. J'ai la possibilité de rajouter la jacquette pour chaque film par l'intermédiaire d'un drag and drop sur un NSImageView. J'ai pas de souci a ce niveau la. grace au bindings ca enregistre mes images dans le .xml. Mais le probleme vient du fait que mon xml grossi énormement a chaque ajout d'image. Je suppose qu'il enregistre les images sans les compressé ni rien. Ce que je voudrais pouvoir faire c'est compresser ces images au niveau de l'enregistrement. Faut t'il que je passe par un ValueTransformer spécifique?
Merci
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaBindings/Tasks/images.html#//apple_ref/doc/uid/20002300
j'ai pas encore tout compris en le lisant. je vais le relire plus attentivement...
Pas forcément... Si on veut maintenir une cohérence, il faut les copier quelque-part, et dans ce cas, autant les compresser dans la base.
Tiens, ça m'amène à une question... Comment sont stockés les blobs en XML ?
Vous allez me dire "entre <data> et </data>", mais s'il y a un "</data>" dans le blob... ?
Enfin si Apple a bien fait le truc et stocké la taille (par exemple), on ne perd pas plus en performance qu'avec des fichiers. Je dirais même moins puisqu'il y a un seul file descriptor à ouvrir au lieu de plein.
dans mon xml l'image a l'air d'etre insérer entre 2 balises attributes et il précise juste avant que c'est du binary.
Un blob c'est justement des données binaires, mais apparemment en XML il ne stocke ça pas vraiment en binaire, mais en hexadécimal... Donc pas de problème pour trouver la balise finale, mais effectivement dans ce cas ça peut poser des problèmes d'optimisation.
a plus
À mon avis, ce que Eddy58 pensait, c'était enregistrer le "path", pas la classe NSFileWrapper
C'est à dire une chaà®ne UTF-8...
Je vote aussi pour la solution d'externaliser les images pour ce genre de problème. Ca évite d'avoir un fichier bien lourd, à charger comme à stocker, et plus facile à maintenir au final. Après que les images soient dans un fileWrapper ou juste dans un dossier spécifique de "Application Support" (ce qui me paraà®t presque plus simple), du moment qu'on a une référence quelquepart...
Par contre dans ce cas cela pourra être bien de proposer à terme du coup une fonction "exporter la base de données" qui wrappe le plist + le dossier "Application Support" (enfin surtout les images associées au plist de la base) dans un seul fichier (que ce soit juste un zip de tout ça, ou un fileWrapper, ou autre) pour que l'on puisse déplacer ou sauvegarder la base facilement. Mais ça tu peux le faire dans un second temps.
Pour moi, ce qui aurait été logique, ça aurait été d'encoder la taille au début, puis en brut. C'est la solution la plus optimisée pour le lire.
Après, c'est sûr que c'est moins pratique pour la lecture des plist "à la main".
Dans mon boulot actuel, je gère une base de données SQLite de plusieurs centaines de Mo. Une petite image compressée en jpg c'est rien pour une BDD.
Après, ça dépend de la philosophie qu'on veut appliquer...
j'ai remarqué que dans mon .xml chaque enregistrement de film a un ID : <object type="MOVIE" id="z200">
puis-je récupéré ce ID d'une quelconque manière?
Donc il faut un minimum encoder : écriture hexa ou base64, mais pas brut, pas dans un fichier (plist) qui à la base est du texte (il existe un format de plist binaire, mais ce n'est qu'une compression de son alterégo textuel, et on peut passer d'un format à l'autre)
Ben oui là c'est logique, c'est une base SQLite. C'est fait pour gérer des grosses quantités de données, et ça gère aussi les données binaires (avec des BLOB justement) très bien. Mais là c'est géré avec du XML, ce qui n'a rien à voir tant quant à la quantité et taille des données manipulables (c'est bien plus lourd de charger un gros XML, format qui n'est pas spécialement dédié à contenir des données binaires et surtout des gros objets, même s'il peut il n'est pas optimisé et fait pour).
De plus, avec une base SQLite, le chargement est sélectif (tu ne charges pas toute la base d'un coup, tu effectue des requêtes sur la base) alors que le XML tu le charges en entier en mémoire. Donc un plus gros XML va être plus lourd à gérer, alors que sinon les bases de données sont tout à fait indiquées pour les grandes quantitées de données, volumineuses ou non.
C'est pour ça que je parlais de philosophie au dessus... À mon avis, pour une application de ce genre, il aurait dû utiliser un format SQLite avec CoreData plutôt qu'un format XML (surtout s'il compte gérer plus d'une centaine d'enregistrements...)
Le XML n'est pas "optimisé" pour contenir du binaire (qui dit hexadécimal dit recherche de la balise finale et conversion ; ça prend du temps).
Initialement en effet je parlais seulement du path, mais si l'utilisateur efface des images le système est bancale. Donc ensuite je pensais effectivement à la classe NSFileWrapper pour enregistrer le xml et stocker une version light des images le tout dans un seul fichier. Après, comment faire ça avec Core Data, je ne l'ai jamais utilisé donc je peux pas dire, en ce qui concerne les bindings un value transformer me parait tout indiqué, il y a une bonne base de départ dans le lien proposé plus haut par idea.
Mais avec Core Data ta suggestion d'utiliser SQlite est encore le plus pratique en effet.
je vais passer mon core data en en registrement SQLite. pour la version 1 du logiciel, et pour mon utilisation personnel ca suffira bien. Si je fais une version 2, je partirai dans une voie plus programmatique, ou je serai plus libre d'enregistrer comme bon me semble.
Ceci permet de les charger en mémoire uniquement lorsque c'est nécessaire (au moment où la relationship est appelée).
Jette un oeil sur la doc Apple, en particulier sur les accesseurs aussi.
Attention à la compatibilité, ça me paraà®t être un point essentiel avec l'utilisation de CoreData. Ne serait-ce qu'une modification du modèle et hop, les fichiers de la version 1 ne sont plus compatibles avec la version 2.
Je pense qu'il faut prendre le temps de modéliser l'application en pensant aux fonctionnalités à venir, et prévoir un export ou un copier-coller des données sous un format qui permettra des les ré-importer ensuite dans une autre version.
Autre chose, je pense qu'il est bon de se préserver 2 formats possibles d'enregistrement des données, SQlite et XML. En cas de corruption, de dysfonctionnement de la base SQlite par exemple, on peut récupérer un backup XML qui est un format plus standard, plus "lisible" aussi.
Voilà ... sinon je pense que SQlite est suffisemment robuste pour stocker des images en grande quantité pour peu qu'on les optimise afin d'alléger le fichier final.
Si c'est pour stocker la photo d'un contact ça va, si c'est pour stocker des travaux de print A5 à 300dpi au format .psd, il faut faire autrement.
"Supports databases up to 2 tebibytes (241 bytes) in size."
"Strings and BLOBs up to 2 gibibytes (231 bytes) in size."
C'est les chiffres théoriques bien sûr, il faut voir la pratique après :
"In practice, you should try to keep your SQLite databases below 100 gigabytes to avoid performance problems."
> www.sqlite.org/
À noter qu'on peut changer son modèle en apportant des nouveautés si on gère la conversion à la volée des anciens formats... C'est ce que font les éditeurs en généralÂ
Effectivement... C'est déjà énorme ; ça laisse de la marge
Comme l'a dit plus haut AliGator, SQLite ne charge pas tout le fichier, mais est capable de se positionner au bon endroit pour lire ce qui l'intéresse, donc c'est pas parce qu'on a une base de 4Go qu'on perd énormément en performance.
Après, c'est sûr qu'il vaut mieux éviter de stocker des images de plus de 2Mo Si on gère ce genre d'image, une gestion à la "iPhoto" s'impose (copie / placement des images dans une architecture triée au niveau du FileSystem)
Exemple : IPhoto et son fameux fichier XML qui permet aux développeurs de lier dans leur application une vue sommaire du contenu de la base de photos sur votre Mac.
Exemple : les données reçues ou envoyées par un SWF ( Flash , Flex) d'une base de données genre mYSQL ou autre. C'est un script PHP qui génère ce XML à partir d'une requête vers la base de données.
Exemple : MXML qui permet de décrire les objets (composants) pour le compilateur.
etc.
Pour résumer , un langage est fait pour communiquer. En informatique , chaque langage est adapté à un type d'information. Faites bien votre choix avant de réaliser votre fonction .