2016-02-22 32 views
6

Najpierw przekonwertowałem obraz na NSData i wstawiłem go do bazy danych sqlite za pomocą fmdb (baza danych mięsa latającego) w postaci bloku sqlite blob . Następnie odzyskałem NSData, ale podczas konwersji NSData na UIImage pojawia się błąd "fatal error: unexpectedly found nil while unwrapping an Optional value". here is the screenshot of the error I am facing "Błąd krytyczny: nieoczekiwanie znaleziono zero podczas rozpakowywania wartości opcjonalnej" podczas tworzenia obiektu UII z pliku NSData

var imageData = String() 
     let countryDB = FMDatabase(path: databasePath as String) 
     if countryDB.open() { 
      let querySQL = "SELECT USERIMAGE FROM USERINFO WHERE ID = \((1))" 







      let results:FMResultSet? = countryDB.executeQuery(querySQL, 
       withArgumentsInArray: nil) 

      if results?.next() == true 
      { 


       let correctPicture = (results?.dataForColumn("USERIMAGE"))! 

       print(correctPicture) 

       let memberPiC : UIImage = UIImage(data: correctPicture)! 
       print(memberPiC) 
      } else { 
       print("record not found") 
      } 
      countryDB.close() 
     } else { 
      print("Error: \(countryDB.lastErrorMessage())") 
     } 

Jest to kod, który użyłem do zapisywania obrazu

func saveData() 
    { 

     var data = NSData() 
     let contactDB = FMDatabase(path : databasePath as String) 

     let image = UIImage(named: "back.png") 
       print(image) 
       if let unwrappedImage = image { 
        data = UIImageJPEGRepresentation(unwrappedImage, 1.0)! 
        print("data" , data) 



     if contactDB.open() 
     { 


      let insertQuery = "INSERT INTO USERINFO(userimage) VALUES('\((data))')" 

      let result = contactDB.executeUpdate(insertQuery, withArgumentsInArray: nil) 
      if !result { 

       print("Error: \(contactDB.lastErrorMessage())") 
      } else { 
          } 
     } 
     else { 
      print("Error: \(contactDB.lastErrorMessage())") 
     } 


    } 


    } 
+0

nope .. correctpic jest rodzaj NSData & not obrazu ... i zawiera wszystkie imageData że mam wpisane w SQLite wcześniej –

+0

można zakładać jakiś kod jako kod? ułatwia kopiowanie/wklejanie. Problem polega prawdopodobnie na tym, że 'UIImage' nie uruchamia się z' correctPicture' i jest wymuszany przez '!' Powodując awarię. Można przypuszczać, że dane 'correctPicture' nie mogą być przekształcone w' UIImage'. – mmarkman

+0

Wysłałem moją część kodu ... thanx za odpowiedź ur :) –

Odpowiedz

2

tutaj po pierwsze mogę zmienić UImage do NSData następnie przekonwertować NSData do base64EncodedString. Potem zapisać ten ciąg w bazie danych SQLite w postaci tekstu zamiast blob

func saveData() 
    { 

     var data = NSData() 
     let contactDB = FMDatabase(path : databasePath as String) 

     //insert an image 
     let image = UIImage(named: "back.png") 
     print(image) 

     //convert an image into database NSdata() 
     if let unwrappedImage = image 
     { 
      data = UIImagePNGRepresentation (unwrappedImage)! 
      print("data" , data) 


      // convert NSdata to baseEncodeng64 

      let dataStr = data.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength) 
      print("converted string" ,dataStr) 

      // save into databse 
      if contactDB.open() 
      { 


       //insert a query 
       let insertQuery = "INSERT INTO USERINFO(USERIMAGE) VALUES('\((dataStr))')" 

       let result = contactDB.executeUpdate(insertQuery, withArgumentsInArray: nil) 
       if !result { 

       print("Error: \(contactDB.lastErrorMessage())") 
      } else { 
          } 
     } 
     else { 
      print("Error: \(contactDB.lastErrorMessage())") 
     } 


    } 


    } 

podczas pobierania obrazu pobrać ciąg danych, które są przechowywane wewnątrz bazy danych sqlite jako String następnie konwertować base64EncodedString do NSData powrotem. Po tym przekonwertuj NSData z powrotem na obraz.

func fetchData() -> UIImage 
    { 
     var decodedimage = UIImage() 
     var imageDataString = String() 
     let countryDB = FMDatabase(path: databasePath as String) 
     if countryDB.open() { 

      //insert a query to fetch imageStringData 
      let querySQL = "SELECT USERIMAGE FROM USERINFO WHERE ID = \((1))" 

      let results:FMResultSet? = countryDB.executeQuery(querySQL, 
       withArgumentsInArray: nil) 

      if results?.next() == true 
      { 



       imageDataString = (results?.stringForColumn("USERIMAGE"))! 

       //convert NSString back to NSdata 
       let decodedData = NSData(base64EncodedString: imageDataString, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) 

       //convert NSdata back to the image 
       decodedimage = UIImage(data: decodedData!)! 
       print("retrieve image" , decodedimage) 

      } else { 
       print("record not found") 
      } 
      countryDB.close() 
     } else { 
      print("Error: \(countryDB.lastErrorMessage())") 
     } 



     return decodedimage 

    }