在 swift 中使用 FMDB 保存 NSI​​mage

save NSImage with FMDB in swift

我正在 swift 为 OS X 开发 CarRental 应用程序。我有一个 NSImageView,用户可以在其中放置图片和一些 TextFields。汽车数据存储在汽车对象数组中。我需要使用 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保存图片?

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

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

在此处了解有关在沙盒中保存图像的更多信息

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

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

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

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

不过,如果您想获得图像的 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 数据库中。