【问题标题】:"fatal error: unexpectedly found nil while unwrapping an Optional value" while creating UIImage from NSData“致命错误:从 NSData 创建 UIImage 时在展开可选值时意外发现 nil”
【发布时间】:2016-02-22 11:33:34
【问题描述】:

首先我将图像转换为NSData,并在fmdb(飞肉数据库)的帮助下以sqlite blob的形式插入到sqlite数据库中。 然后我取回了 NSData,但是在将 NSData 转换为 UIImage 时,我收到一个错误“fatal error: unexpectedly found nil while unwrapping an Optional value”。

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

这是我用来保存图片的代码

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


    }


    }

【问题讨论】:

  • nope..correctpic 是 NSdata 的类型,而不是图像...& 它包含我之前在 sqlite 中输入的所有 imageData
  • 你能把一些代码作为代码发布吗?使复制/粘贴更容易。问题可能是UIImage 无法使用correctPicture 进行初始化,并且它被! 强制导致崩溃。可以推断correctPicture的数据不能转换成UIImage
  • 我发布了我的部分代码...感谢您的回复:)
  • np。这些数据是如何插入到FMDatabase 中的?你是手动输入的吗?
  • 我在 swift 代码中编写了插入查询,并在 fmdb 的帮助下插入了数据。这是我使用的查询.. let insertQuery = "INSERT INTO USERINFO(userimage) VALUES('((data))')"

标签: ios xcode swift2 nsdata


【解决方案1】:

首先我将 UImage 更改为 NSData 然后将 NSData 转换为 base64EncodedString。 之后将此字符串以 TEXT 而不是 blob 的形式保存在 sqlite 数据库中

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


    }


    }

在检索图像时,获取存储在 sqlite 数据库中的字符串数据作为字符串,然后将 base64EncodedString 转换回 NSdata。之后将 NSData 转换回图像。

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

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 2016-02-29
    • 2020-09-19
    • 2016-01-08
    相关资源
    最近更新 更多