2017-02-23 3 views
0

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)") 
    } 
} 

Antwort

1

Ihre Typen sind alle durcheinander.

Sie beginnen mit data was ich nehme, ist Daten und wandeln es in eine Zeichenfolge namens image. Dann in saveImageToDB behandeln Sie die Zeichenfolge image wie es war eine und versuchen, es zuerst in Daten konvertieren mit UIImagePNGRepresentation (was wird fehlschlagen, weil es eine Zeichenfolge ist), dann versuchen Sie, diese Daten in eine Zeichenfolge zu konvertieren, und dann versuchen, das zu konvertieren String zurück in Daten, die auch falsch sind.

Wenn Sie Daten in der Datenbank speichern, übergeben Sie die Daten einfach an saveImageToDB. Ändern Sie image in saveImageToDB zu imageData und schneiden Sie alles, was Sie von String zu Daten zu Bild und zurück konvertieren. Sie beginnen mit Daten und möchten Daten speichern, daher gibt es keinen Grund, dies zu tun.

+0

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)") } } –

+0

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. –

+0

Ja, Sie haben Recht. Es funktioniert jetzt zumindest das sparende Bit. –