我在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保存图像?
答案 0 :(得分:1)
不要将整个图像保存在FMDB中。
将图像保存在沙箱中,只需将图像路径保存在FMDB中即可。
有关在沙盒中保存图像的详细信息
答案 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数据库中存储对该文件的相对引用。