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

Viv*_*enG 25 realm ios swift2

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

可能吗?如何?

这样做可能不好吗?

Pro*_*ver 51

您可以将图像存储为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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

以下是如何做到这一点:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • @ J.Doe他的意思是,将一滴数据(图像)保存到Realm是一个坏主意。将图像保存到documents目录并在Realm中保存其路径是一个很好的选择。 (2认同)

Geo*_*rna 5

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

重要提示:唯一的变化是现在stringByAppendingPathComponent已从 Swift 2.1 中删除,因此您将收到一条错误消息:

stringByAppendingPathComponent 不可用:在 NSURL 上使用 URLByAppendingPathComponent 代替。

请记住,虽然它可能很烦人,但它已被删除是有原因的,您应该按照苹果的建议改用 NSURL。但是如果你想继续这个解决方案,Swift 2.1+ 的修复是显式转换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)
    }
}
Run Code Online (Sandbox Code Playgroud)