2016-12-14 69 views
1

对于这个问题非常直接。将图像写入数据库然后读取它会产生两组不同的代码。根据我的理解,代码将图像转换为NSData,然后将其写入数据库。然后它从数据库中读取它,然后将其转换回图片形式。在Swift 3中将图像写入SQLite

下面是'选择'按钮的代码,它将NSData传递给稍后使用的全局变量。

@IBAction func btnCCTV1(_ sender: Any) { 


    // Put Your Image URL 
    let url:NSURL = NSURL(string : "http://cctv-sg.com/images/sr/01.jpg")! 
    // It Will turn Into Data 
    let imageData : NSData = NSData.init(contentsOf: url as URL)! 
    // Data Will Encode into Base64 
    let str64 = imageData.base64EncodedData(options: .lineLength64Characters) 
    // Now Base64 will Decode Here 
    let data: NSData = NSData(base64Encoded: str64 , options: .ignoreUnknownCharacters)! 
    // turn Decoded String into Data 
    let dataImage = UIImage(data: data as Data) 
    // pass the data image to image View.:) 
    viewImage.image = dataImage 

    print("====64====") 
    print (str64) 
    print(imageData) 

    GlobalVar.data64 = imageData as NSData 
    GlobalVar.imageByte=dataImage 




} 

然后我们有将数据保存到数据库的功能。

@IBAction func btnSave(_ sender: Any) { 

    let contactDB = FMDatabase(path: databasePath as String) 



    print("==image====") 
    // print(GlobalVar.imageByte) 

    if (contactDB?.open())! { 

     let insertSQL = "INSERT INTO CAMLOCATION (camname, latitude, longitude, description, photo) VALUES ('\(txtCamname.text!)', '\(txtLatitude.text!)', '\(txtLongitude.text!)', '\(txtDescription.text!)', '\(GlobalVar.data64)')" 

     let result = contactDB?.executeUpdate(insertSQL, 
               withArgumentsIn: nil) 

     if !result! { 
      lblResult.text = "Failed to add contact" 
      print("Error: \(contactDB?.lastErrorMessage())") 
     } else { 
      lblResult.text = "Contact Added" 
      txtCamname.text = "" 
      txtLatitude.text = "" 
      txtLongitude.text = "" 
      txtDescription.text = "" 
     } 
    } else { 
     print("Error: \(contactDB?.lastErrorMessage())") 
    } 

} 

最后,找到函数来检索所述结果。它使用相机名称进行搜索。

//====================================FIND BUTTON================================ 

@IBAction func btnFind(_ sender: Any) { 

    let contactDB = FMDatabase(path: databasePath as String) 



    print("========btnFind===========") 

    if (contactDB?.open())! { 
     let querySQL = "SELECT camname, latitude, longitude, description, photo FROM CAMLOCATION WHERE camname = '\(txtID.text!)'" 

    //var blob: Data? 
     print(querySQL) 
     let results:FMResultSet? = contactDB?.executeQuery(querySQL, 
                  withArgumentsIn: nil) 

     //http://stackoverflow.com/questions/29067242/display-image-from-sqlite-blob-in-swift 

     if results?.next() == true { 
      txtCamname.text = results?.string(forColumn: "camname") 
      txtLatitude.text = results?.string(forColumn: "latitude") 
      txtLongitude.text = results?.string(forColumn: "longitude") 
      txtDescription.text = results?.string(forColumn: "description") 
      GlobalVar.data64 = results!.data(forColumn: "photo") as NSData 

      print("$$$$$$$$$$$$$$$$$$$$$$$") 

      print(GlobalVar.data64) 

      // let correctPicture = results?.data(forColumn:"photo") 

      //GlobalVar.imageByteGet = results?(forColumn:"photo") 

      //blob = results?.data(forColumn: "photo") 

      // let ima = NSImage.init(data: blob!) 

      // turn Decoded String into Data 

      let dataImage = UIImage(data: GlobalVar.data64 as Data) 
      // pass the data image to image View.:) 
      viewImage.image = dataImage 

      // print(imageByteGet) 

      // viewImage.image = UIImage(data: imageByteGet!) 

      //GlobalVar.display64 = results!.data(forColumn: "photo") 
      lblResult.text = "Record Found" 

     } else { 

      lblResult.text = "Record not found" 
      txtCamname.text = "" 
      txtLatitude.text = "" 
      txtLongitude.text = "" 
      txtDescription.text = "" 

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



    print("========Attempting decoding...===========") 




    print("========Decoding....Done. Image should appear.===========") 
} 

问题是,检索产生了与我输入的结果不同的结果。任何帮助表示赞赏。谢谢。

回答

1

如果有任何帮助表示赞赏,我会建议您重写代码以将图像存储在磁盘上;至于我,这是更好的解决方案。如果你这样做,你的数据库可以存储路径图像。

This is酷和易于学习库,以帮助您实现轻松存储。一般的算法是:

  • 选择唯一的字段为所有的图像SDWebImage的
  • 使用storeForKey将图像保存到磁盘某处
  • 需要
+0

嗯有趣的当imageForKey检索你的形象。我会考虑这个选项。 –