Ja ich weiß, es gibt noch andere Fragen wie diese, aber keine Antworten schien noch für mich zu arbeiten ...Swift 3 - speichern und holen Bild von Kerndaten
ich einen API-Aufruf, die eine Base64 String zurückgibt . Dies versuche ich in Kerndaten zu speichern und dann als Bild zurück zu geben. Ich kann jedoch nicht herausfinden, wo ich falsch liege, und vielleicht können ein paar von deinen klugen Köpfen mir helfen. Diese
ist, wo ich Daten von meinem api Anruf empfangen:
let image = data?.base64EncodedString()
saveImageToDB(brandName: imageBrandName, image: image!)
der Markenname einfach eine Zeichenfolge, ex sein: "Baresso".
Mein saveImageToDB:
func saveImageToDB(brandName: String, image: String) {
let managedContext = getContext()
let entity = NSEntityDescription.entity(forEntityName: "CoffeeShopImage", in: managedContext)!
let CSI = NSManagedObject(entity: entity, insertInto: managedContext)
let image = UIImage(named: image)
//this is the line that appears to be wrong
let imageData = NSData(data: (UIImagePNGRepresentation(image!)?.base64EncodedData())!)
CSI.setValue(imageData, forKey: brandName)
do {
try managedContext.save()
print("saved!")
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
}
Meine holen func:
func getImageFromDB(callback: @escaping (_ image: UIImage)->()) {
var imageFromDB: UIImage?
let fetchRequest: NSFetchRequest<NSManagedObject> = NSFetchRequest(entityName: "CoffeeShopImage")
do {
let searchResults = try getContext().fetch(fetchRequest)
for images in searchResults {
let image = images.value(forKey: "Baresso") as! NSData
imageFromDB = UIImage(data: image as Data)!
callback(imageFromDB!)
}
} catch {
print("Error with request: \(error)")
}
}
Mein Fehlerprotokoll:
fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb)
So scheint es, ich bin nicht mein Bild zu speichern, die irgendwie Sinn macht, aber ich kann nicht herausfinden, was ich falsch mache?
EDIT:
ich meine Typen vermasselt. Der korrigierte Code lautet wie folgt:
func saveImageToDB(brandName: String, image: NSData) {
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)")
}
}
Ich war definitiv mit meinen Typen verwirrt. Wie funktioniert dieser Blick für meine sparen: func saveImageToDB (herstellername: String, Bild: String) { lassen managedContext = getContext() let entity = NSEntityDescription.entity (forEntityName: "CoffeeShopImage", in: managedContext)! lassen CSI = NSManagedObject (Einheit: Einheit, InsertInto: managedContext) CSI.setValue (Bild, forKey: herstellername) {(! "Gerettet") versuchen managedContext.save() Druck } fangen lassen Fehler als NSError { print ("Konnte nicht speichern. \ (Fehler), \ (error.userInfo)") } } –
Welche Eigenschaften sind für die 'CoffeeShopImage' Entität definiert? Ich erwarte, dass es eine namens imageData und eine andere namens imageName gibt. Du solltest also etwas wie 'CSI 'haben.setValue (imageData, forKey: "imageData)" und 'CSI.setValue (brandName, forKey:" brandName "). Sie sind zwei verschiedene Felder, kein Schlüssel-Wert-Paar. –
Ja, Sie haben Recht. Es funktioniert jetzt zumindest das sparende Bit. –