使用FMDB在swift中保存NSImage

时间:2015-06-07 17:38:44

标签: swift fmdb

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

2 个答案:

答案 0 :(得分:1)

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

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

有关在沙盒中保存图像的详细信息

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

答案 1 :(得分:0)

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

如果可能,应首先使用您用于创建NSImage的原始数字资产。例如,如果您从PNG或JPEG文件加载它,请返回并从该文件中获取func PNGRepresentation(image: NSImage) -> NSData? { if let TIFFRepresentation = image.TIFFRepresentation, bitmap = NSBitmapImageRep(data: TIFFRepresentation) { return bitmap.representationUsingType(.NSPNGFileType, properties: [:]) } return nil }

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

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

loads

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