在 swift 中使用 FMDB 保存 NSImage
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 数据库中。
我正在 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 数据库中。