6
votes

Comment stocker une image dans les données de base?

Juste une suppose: je fais un attribut et fais de son type "binaire". Mais à la fin, comment j'utiliserais ça? Je suppose qu'il y a une nsdata dans les coulisses? Donc, cet attribut prend réellement une NSDATA?


0 commentaires

3 Réponses :


1
votes

C'est correct, utilisez binaire qui est représenté comme objet NSData, vous pouvez utiliser UIIMages ImageWithData Class Méthode afin de récupérer vos images.


0 commentaires

19
votes

Cette question a été posée à plusieurs reprises et la réponse est un peu plus complexe.

En ce qui concerne les données binaires, vous devez déterminer comment le stocker en fonction de la taille attendue des données avec laquelle vous travaillerez. La règle est:

  • moins de 100k; magasin comme une propriété binaire dans votre table principale
  • moins de 1 m; Stocker comme une propriété binaire dans une table auxiliaire pour éviter de chercher
  • supérieur à 1 m; Conservez sur le disque et stockez son chemin de fichier dans la table de données principale.

    De plus, lorsque vous stockez des images, il est recommandé de les stocker dans un format standard tel que JPG ou PNG. En utilisant le type de propriété transformable, vous pouvez réellement avoir votre sous-classe donner l'apparition d'accéder à la classe uIImage lorsque le magasin réel est une représentation PNG. Je vais dans cela en détail dans le pool-poste sur Cocoa est ma petite amie .

    Mise à jour

    La raison derrière la conservation des données binaires 1M sur le disque est en raison du cache. Le NSPersistentStorecoordinator conservera un cache de données de sorte que lorsque votre application demande l'objet "Suivant", il n'a pas besoin de revenir sur le disque. Ce cache fonctionne vraiment bien. Cependant, il est petit, très petit sur iOS. Si vous tirez dans une grosse morceaux de données binaires, vous pouvez facilement souffler que toute la cache et votre application entière suffit grandement.


6 commentaires

Quel est le raisonnement derrière le stockage d'images de plus de 1 m sur le disque au lieu des données de base?


Excellent article sur CIMG. Merci!


Merci pour ces conseils et le système de portabilité de données de base. Si vous êtes toujours là, puis-je demander, que voulez-vous dire par "Table principale" vs. Tableau auxiliaire "?


La personne dans une application d'adresses serait une table / entité principale. L'image pourrait être une table auxiliaire qui n'est pas directement accessible et n'est accessible qu'en référence à une personne.


Vous dites, stockez-le comme une propriété binaire, mais pourquoi ne pas la stocker comme transformable?


Le troisième paragraphe dit d'utiliser le type de propriété transformable, mais vous souhaitez stocker le binaire vous-même au lieu de simplement sérialiser l'uImage. En le stockant en tant que PNG / JPEG, vous rendez les données lisibles par tout ce qui peut lire le magasin (SQLite est fréquent par exemple) plutôt que de simplement atteindre l'objectif-c.



0
votes

La réponse de Marcus fonctionne, mais ce n'est pas le moyen facile - et, Afaict, ce n'est pas la façon dont Apple "a l'intention" de le faire. En théorie, vous devriez pouvoir simplement marquer l'image comme "transformable" et CD ferait tout automatiquement.

qui ne fonctionne pas car l'uImage est "manquant" la mise en œuvre de NSCODING - le système de sérialisation d'Apple - et donc Transformateur par défaut du CD ne contient aucune idée de savoir comment enregistrer une image. P>

L'alternative, qui nécessite un petit code, mais est toujours plus simple que l'approche de Marcus ... vous aurait rencontré des bugs d'Apple. La mise en œuvre de Coredata d'Apple (prétendument) a été brisée depuis 2008 - les transformateurs personnalisés sont ignorés pour tout magasin de données de type "binaire". P>

retour sur "CD ferait tout automatiquement, si seulement uiimage était configuré Droite "... IMHO, UIIMAGE doit être sérialisable, même si la sérialisation" Par défaut "n'est pas idéale pour tous les cas. Si vous résolvez cela, alors lo et voici ... Coredata commence à enregistrer / lâcher les cas d'uiImage avec codage zéro de votre part. P>

Voici le code pour faire vos instances uImage toutes sérialisables. Tout ce que vous avez à faire est d'importer cette catégorie / Copy Coller cette catégorie dans les classes où vous souhaitez la version UIImage "mise à niveau". P>

@implementation UIImage (MyCategory)

- (void)encodeWithCoder:(NSCoder *)encoder
{
    [encoder encodeDataObject:UIImagePNGRepresentation(self)];
}

- (id)initWithCoder:(NSCoder *)decoder
{
    NSData *data = [[decoder decodeDataObject] retain];

    return [[UIImage alloc] initWithData:data];
}

@end


0 commentaires