如何将图像放入Realm数据库?

时间:2015-10-23 09:53:36

标签: ios swift2 realm

我正在使用Swift 2编写iOS应用程序,我想在Realm数据库中本地保存帐户的个人资料图片。我找不到任何文件或人们在谈论这个。

有可能吗?怎么样?

这样做可能不好吗?

2 个答案:

答案 0 :(得分:49)

您可以将图像存储为NSData。如果你有一个图像的URL,你想在本地存储,这里有一个代码片段,如何实现。

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

这样做可能是个坏主意吗?

规则很简单: 如果图像尺寸较小,图像数量很少而且很少更改,您可以坚持将它们存储在数据库中。

如果有一堆图像,最好将它们直接写入文件系统,只需将图像的路径存储在数据库中。

以下是如何做到的:

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

请注意:由于存在许多陷阱,因此两种代码示例都不是下载图像的可靠方法。在现实世界的应用/制作中,我建议使用专门用于此目的的库,如AFNetworkingAlamofireImage

答案 1 :(得分:4)

为Swift 2.2更新了ProblemSlover的解决方案:

重要说明:唯一的变化是,自Swift 2.1起,现在stringByAppendingPathComponent已被删除,因此您会收到错误消息:

  

stringByAppendingPathComponent不可用:改为在NSURL上使用URLByAppendingPathComponent。

请注意,尽管它可能很烦人,但由于某种原因它已被删除,您应该遵循苹果的建议来改为使用NSURL。 但是如果您希望继续使用此解决方案,Swift 2.1+的修复方法是明确将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)
    }
}