[英]save NSImage with FMDB in swift
我正在快速開發適用於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保存圖像?
FMDB可以節省NSData
在SQLite的對象為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數據庫中存儲對該文件的相對引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.