簡體   English   中英

Swift 3 - 將圖像保存到Core Data

[英]Swift 3 - Saving images to Core Data

出於某種原因,我無法弄清楚如何將圖像保存到核心數據並再次獲取它們。 我覺得這是我的類型,但看看:

圖像保存為二進制數據並存儲在外部記錄文件中

我從api調用我的服務器獲取數據。 它返回一個base64字符串。 這是我獲取數據的地方:

updateAccessTokenOnly(newAccessToken: aToken!)
saveImageToDB(brandName: imageBrandName, image: data! )

在這里,我將它保存到我的DB:

func saveImageToDB(brandName: String, image: Data) {
    dropImages(){tableDropped in
        let managedContext = getContext()
        let entity = NSEntityDescription.entity(forEntityName: "CoffeeShopImage", in: managedContext)!
        let CSI = NSManagedObject(entity: entity, insertInto: managedContext)

        CSI.setValue(image, forKey: "image")
        CSI.setValue(brandName, forKey: "brandName")

        do {
            try managedContext.save()
            print("saved!")
        } catch let error as NSError {
            print("Could not save. \(error), \(error.userInfo)")
        }
    }
}

然后去取它:

    func getImageFromDB(callback: @escaping (_ image: UIImage)-> ()) {

    let fetchRequest: NSFetchRequest<NSManagedObject> = NSFetchRequest(entityName: "CoffeeShopImage")

    do {
        let searchResults = try getContext().fetch(fetchRequest)

        for images in searchResults {
            print("vi når her ned i get image")
            if (images.value(forKey: "brandName")! as! String == "Baresso"){
                print(images.value(forKey: "brandName")! as! String)

                let image: Data = images.value(forKey: "image")! as! Data
                let decodedimage = UIImage(data: image)

                callback(decodedimage!)

            }
        }
    } catch {
        print("Error with request: \(error)")
    }
}

完整錯誤日志:

https://docs.google.com/document/d/1gSXE64Sxtzo81eBSjv4bnBjBnnmG4MX2tuvNtnuJDIM/edit?usp=sharing

希望有人能提供幫助。 提前致謝!

更新

所以我卸載了應用程序,然后上面的代碼工作。 然而這些照片是藍色的嗎? (是的,我已經檢查過從數據庫發送的圖片是否正確)。

有解決方案嗎

從CoreData獲取的圖片

更換

let image: Data = images.value(forKey: "image")! as! Data
let dataDecoded : Data = Data(base64Encoded: image, options: [])!
let decodedimage = UIImage(data: dataDecoded)

let image: Data = images.value(forKey: "image")! as! Data
let decodedimage = UIImage(data: image)

Base64是一種將數據轉換為字符串的方法。 這里沒有理由使用它。 您已經擁有了數據庫中的數據,您只想將其轉換為UIImage。

也改變了

let image = data?.base64EncodedData()
saveImageToDB(brandName: imageBrandName, image: image!)

saveImageToDB(brandName: imageBrandName, image: data!)

base64EncodedData將數據從圖像數據轉換為基於utf-8編碼的64位編碼字符串。 沒有理由這樣做。

您應該從服務器獲取base64編碼的字符串,將其轉換為數據,然后再也不需要base64。 讀取和寫入數據到數據庫,並閱讀后其轉換為一個UIImage。 Base64是一種傳輸數據的編碼方法。 如果您不與服務器通信,則沒有理由使用base64。

在Jon Rose建議的更正后,我需要的是添加

.withRenderingMode(.alwaysOriginal)

我在哪里展示我的照片和代碼工作。

用戶實體

保存圖片:

 guard let managedObjectContext = managedObjectContext else { return }

    // Create User
    let user = User(context: managedObjectContext)

    // Configure User
    user.name = "name"
    user.about = "about"
    user.address = "Address"
    user.age = 30
    if let img = UIImage(named: "dog.png") {
        let data = img.pngData() as NSData?
        user.image = data
    }

獲取圖片:

// Create Fetch Request
    let fetchRequest: NSFetchRequest<User> = User.fetchRequest()

    // Configure Fetch Request
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
    let users = try! managedContext.fetch(fetchRequest)
    let user: User = users.first as! User
    if let imageData = user?.image {
            imgView.image = UIImage(data: imageData as Data)
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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