用 FMDB 快速保存 NSI​​mage

Posted

技术标签:

【中文标题】用 FMDB 快速保存 NSI​​mage【英文标题】:save NSImage with FMDB in swift 【发布时间】:2015-06-07 17:38:44 【问题描述】:

我正在快速开发适用于 OS X 的 CarRental 应用程序。我有一个 NSImageView,用户可以在其中放置图片和一些 TextField。汽车数据存储在汽车对象数组中。我需要使用 FMDB 将此数据写入 SQLite 数据库。 我的文字没有问题,但是如何保存图片? 下面的代码运行没有错误,但它没有正确保存图像。

let sql = "INSERT INTO tblCars (cMakeModel, cPrice, cPhoto) VALUES (?,?,?)"

    if let db = DBManager.openDB(dbName) 

        for var i = 0; i < carsArray.arrangedObjects.count; ++i 
            let car = carsArray.arrangedObjects[i] as CarData

            let ok = db.executeUpdate(sql, withArgumentsInArray: [car.makeModel, car.price, car.photo!])

            if !ok 
                println("Error: \(db.lastErrorMessage())")
                return
            
        
        println("Car added")
    

如何使用 FMDB 保存图像?

【问题讨论】:

【参考方案1】:

不要将整个图像保存在 FMDB 中。

将图像保存在沙盒中,只需将图像路径保存在 FMDB 中即可。

更多关于在沙盒中保存图像的信息

How do I save an image to the sandbox - iPhone SDK

【讨论】:

【参考方案2】:

FMDB 可以将 SQLite 中的 NSData 对象保存为 BLOB。因此,唯一的问题是如何获取图像的NSData 表示(例如 PNG、JPEG、TIFF 等)。

如果可能,应首先使用您用于创建NSImage 的原始数字资产。例如,如果您从 PNG 或 JPEG 文件加载它,请返回并从该文件中获取 NSData

如果您只有一个NSImage 对象,您可以为该图像创建一个表示。这通常并不理想,因为您通常可以使资产比原来更大和/或您可以引入质量损失。

但是,如果您想获得图像的 PNG 表示,您可以执行以下操作:

func PNGRepresentation(image: NSImage) -> NSData? 
    if let TIFFRepresentation = image.TIFFRepresentation, bitmap = NSBitmapImageRep(data: TIFFRepresentation) 
        return bitmap.representationUsingType(.NSPNGFileType, properties: [:])
    

    return nil

正如 Rajeev 指出的那样,如果您的图像很大(即不是缩略图大小),SQLite 不太适合存储大型二进制对象。因此,您可以将数字资产存储在文件系统中(例如,在您的应用程序的沙箱中),然后只将对该文件的相对引用存储在 SQLite 数据库中。

【讨论】:

以上是关于用 FMDB 快速保存 NSI​​mage的主要内容,如果未能解决你的问题,请参考以下文章

快速使用 FMDB - 返回布尔值

iOS 数据库开源框架FMDB的快速入门与使用

FMDB 二次封装工具类,让你快速学会封装,集成数据库

如何从 FMDB 获取两个数据并快速返回一个将其中两个组合在一起的字符串?

iOS FMDB 不需要关闭

FMDB/sqlite 查询函数问题