2016-02-22 18 views
6

Đầu tiên tôi chuyển đổi hình ảnh thành NSData và chèn vào cơ sở dữ liệu sqlite với sự trợ giúp của fmdb (cơ sở dữ liệu thịt bay) dưới dạng đốm trắng . Sau đó, tôi lấy lại NSData, nhưng trong khi chuyển đổi NSData thành UIImage, tôi gặp lỗi "fatal error: unexpectedly found nil while unwrapping an Optional value". here is the screenshot of the error I am facing "lỗi nghiêm trọng: bất ngờ tìm thấy nil trong khi mở một giá trị tùy chọn" trong khi tạo UIImage từ 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())") 
     } 

Đây là mã mà tôi sử dụng để lưu một hình ảnh

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 là loại NSdata & không phải hình ảnh ... & có chứa tất cả imageData mà tôi đã nhập trong sqlite trước đây –

+0

bạn có thể đăng một số mã làm mã không? làm cho sao chép/dán dễ dàng hơn. Vấn đề có thể là 'UIImage' không thể khởi động với' correctPicture' và nó bị buộc bởi '!' Gây ra sự cố. Có thể lý luận rằng dữ liệu 'correctPicture' không thể chuyển đổi thành' UIImage'. – mmarkman

+0

Tôi đã đăng một phần mã của mình ... thanx cho phản hồi ur :) –

Trả lời

2

đây trước hết tôi thay đổi UImage vào NSData sau đó chuyển đổi NSData vào base64EncodedString. Sau đó lưu chuỗi này trong một cơ sở dữ liệu SQLite dưới dạng TEXT thay vì 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())") 
     } 


    } 


    } 

Trong khi lấy một hình ảnh lấy dữ liệu chuỗi được lưu trữ bên trong cơ sở dữ liệu SQLite như String sau đó chuyển đổi base64EncodedString vào NSData lại. Sau đó chuyển đổi NSData trở lại hình ảnh.

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 

    } 
Các vấn đề liên quan