¿Cómo poner una imagen en una base de datos Realm?

Estoy escribiendo una aplicación de iOS usando Swift 2 y me gustaría guardar la imagen de perfil de una cuenta localmente en una base de datos de Realm. No puedo encontrar documentación ni personas hablando de eso.

¿Es posible? ¿Y cómo?

¿Puede ser que es malo hacer eso?

Puede almacenar imágenes como NSData . Dado que tiene la URL de una imagen, que desea almacenar localmente, aquí hay un fragmento de código de cómo se puede lograr.

 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) } } 

Puede ser que es una mala idea hacer eso?

La regla es simple: si las imágenes son pequeñas, el número de imágenes es pequeño y rara vez se modifican, puede conservarlas en la base de datos.

Si hay un montón de imágenes, es mejor que las escriba directamente en el sistema de archivos y solo almacene la ruta de la imagen en la base de datos.

Aquí es cómo se puede hacer eso:

 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) } } 

Tenga en cuenta: Ambos ejemplos de código no son métodos confiables para descargar imágenes, ya que hay muchas trampas. En aplicaciones del mundo real / en producción, sugiero usar una biblioteca diseñada para este propósito como AFNetworking o AlamofireImage .

La solución de ProblemSlover se actualizó para Swift 2.2:

Nota importante: el único cambio es que ahora stringByAppendingPathComponent se ha eliminado a partir de Swift 2.1, por lo que obtendrá un error que dice:

stringByAppendingPathComponent no está disponible: use URLByAppendingPathComponent en NSURL.

Tenga en cuenta que, si bien puede ser molesto, se eliminó por alguna razón y debe seguir la recomendación de apple para usar NSURL. PERO, si desea continuar con esta solución, la solución para Swift 2.1+ es convertir explícitamente los documentsPath de NSString a 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) } }