Comment mettre une image dans une base de données Realm?
j'écris une application iOS en utilisant Swift 2 et j'aimerais enregistrer une image de profil d'un compte localement dans une base de données de domaine. Je ne trouve aucun document ou personne qui parle de ça.
Est-il possible? Et comment?
Peut-être est-ce un mal?
2 réponses
Vous pouvez stocker des images NSData
. Étant donné que vous avez L'URL D'une image, que vous voulez stocker localement, voici un extrait de code comment cela peut être réalisé.
class MyImageBlob {
var data: NSData?
}
// Working Example
let url = NSURL(string: "http://images.apple.com/v/home/cb/images/home_evergreen_hero_iphone_medium.jpg")!
if let imgData = NSData(contentsOfURL: url) {
var myblob = MyImageBlob()
myblob.data = imgData
let realm = try! Realm()
try! realm.write {
realm.add(myblob)
}
}
Peut-être que c'est une mauvaise idée de faire cela?
La règle est simple: Si les images sont de petite taille, le nombre d'images est petit et elles sont rarement changées, vous pouvez vous en tenir à les stocker dans la base de données.
S'il y a un tas d'images, il est préférable de les écrire directement à la système de fichiers et l'enregistrement du chemin de l'image dans la base de données.
Ici est de savoir comment cela peut être fait:
class MyImageStorage{
var imagePath: NSString?
}
let url = NSURL(string: "http://images.apple.com/v/home/cb/images/home_evergreen_hero_iphone_medium.jpg")!
if let imgData = NSData(contentsOfURL: url) {
// Storing image in documents folder (Swift 2.0+)
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let writePath = documentsPath?.stringByAppendingPathComponent("myimage.jpg")
imgData.writeToFile(writePath, atomically: true)
var mystorage = MyImageStorage()
mystorage.imagePath = writePath
let realm = try! Realm()
try! realm.write {
realm.add(mystorage)
}
}
remarque: les deux exemples de code ne sont pas des méthodes fiables pour télécharger des images car il y a de nombreux pièges. Dans le monde réel applications / en production, je suggérerais d'utiliser une bibliothèque prévue à cet effet comme AFNetworking ou AlamofireImage.
solution de ProblemSlover mise à jour pour Swift 2.2:
Note Importante: le seul changement est que maintenant stringByAppendingPathComponent
a été supprimé à partir de Swift 2.1, donc vous obtiendrez une erreur disant:
stringByAppendingPathComponent n'est pas disponible: utilisez URLByAppendingPathComponent sur NSURL à la place.
s'il vous plaît gardez à l'esprit que bien qu'il puisse être ennuyeux, il a été enlevé pour une raison et vous devriez suivre la recommandation d'apple d'utiliser NSURL à la place. mais si vous souhaitez procéder avec cette solution, le correctif pour Swift 2.1+ est de lancer explicitement documentsPath
NSString
:
class MyImageStorage{
var imagePath: NSString?
}
let url = NSURL(string: "http://images.apple.com/v/home/cb/images/home_evergreen_hero_iphone_medium.jpg")!
if let imgData = NSData(contentsOfURL: url) {
//Explicitly cast to NSString
let documentsPath = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString)
let writePath = documentsPath.stringByAppendingPathComponent("myimage.jpg")
imgData.writeToFile(writePath, atomically: true)
var mystorage = MyImageStorage()
mystorage.imagePath = writePath
let realm = try! Realm()
try! realm.write {
realm.add(mystorage)
}
}