用 FMDB 快速保存 NSImage
Posted
技术标签:
【中文标题】用 FMDB 快速保存 NSImage【英文标题】: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 快速保存 NSImage的主要内容,如果未能解决你的问题,请参考以下文章