从NSData创建UIImage时出现“致命错误:在展开可选值时意外发现nil”。

3
首先,我将一张图片转换为NSData格式,并借助于fmdb(flying meat database)以sqlite二进制大对象(blob)的形式插入到数据库中。 然后,我取回NSData数据,但在将NSData转换成UIImage时出现了错误,报错信息为"fatal error: unexpectedly found nil while unwrapping an Optional value"。 这是我遇到的错误截图:here is the screenshot of the error I am facing
 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())")
        }


    }


    }

不对。。。正确的是correctpic是NSdata类型而不是图片... 它包含了我之前在sqlite中输入的所有图像数据 - Priyanka Kanse
你能把代码以代码的形式发布吗?这样复制/粘贴更容易。问题可能是 UIImage 无法使用 correctPicture 进行初始化,而由于 ! 的作用导致崩溃。可以推断出 correctPicture 的数据无法转换为 UIImage - olympia
我发布了我的代码...谢谢你的回复 :) - Priyanka Kanse
我应该发布我用于插入数据的整个代码吗? - Priyanka Kanse
是的,那会有所帮助。我找到了一个插入的示例,这可能会有所帮助:http://stackoverflow.com/a/30696664/3191309 - 我还发现许多资源都说这种图像存储方法不太理想。为什么要使用FMDB呢? - olympia
显示剩余5条评论
1个回答

2

首先,我将UImage转换为NSData,然后将NSData转换为base64EncodedString。之后以TEXT的形式将此字符串保存在sqlite数据库中,而不是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())")
        }


    }


    }

在检索存储在SQLite数据库中的字符串数据时,获取图像提取字符串数据,并将其转换为base64编码的字符串。然后将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

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接