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?

20
demandé sur marius 2015-10-23 12:53:35

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.

44
répondu ProblemSlover 2015-12-27 14:33:55

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 documentsPathNSString:

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)
    }
}
3
répondu Geoherna 2016-04-12 17:07:00