【问题标题】:How to put an image in a Realm database?如何将图像放入 Realm 数据库中?
【发布时间】:2016-01-22 19:46:15
【问题描述】:

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

有可能吗?怎么做?

这样做可能不好吗?

【问题讨论】:

    标签: ios swift2 realm


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您可以将图像存储为NSData。给定您想要存储在本地的图像的 URL,这里有一个代码 sn-p 如何实现。

      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

      【讨论】:

      • 为什么将图像保存到文档目录是个坏主意?
      • @J.Doe 他的意思是,将数据块(图像)保存到 Realm 是个坏主意。将图像保存到文档目录并在 Realm 中保存到它的路径是一个不错的理想选择。
      • 我想保存图片。我的图像位于本地文件夹中。我该怎么做?
      • @DanCode 呈现 UIImagePicker,当您从库中选择图像时,获取字符串中的路径,并保存到领域。查看更多关于图像选择器的信息:stackoverflow.com/a/59609111/7987502
      猜你喜欢
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 2019-09-12
      相关资源
      最近更新 更多