簡體   English   中英

快速將NSImage與FMDB保存在一起

[英]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中。

將圖像保存在沙箱中,然后只需將圖像路徑保存在FMDB中。

有關在此處將圖像保存在沙箱中的更多信息

如何將圖像保存到沙箱-iPhone SDK

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM