2016-12-14 6 views
1

So direkt auf das Problem. Wenn Sie das Bild in die DB schreiben und es dann lesen, erhalten Sie zwei verschiedene Code-Sätze. Der Code konvertiert das Bild in NSData und schreibt es dann in die DB, von dem, was ich verstehe. Dann liest es es aus der DB zurück und übersetzt es dann zurück in die Bildform.Schreiben von Bild zu SQLite in Swift 3

Hier ist der Code für eine "Auswahl" -Schaltfläche, wo die NSData an die globale Variable übergeben wird, die später verwendet werden soll.

@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 




} 

Dann haben wir die Funktion, um die Daten in der Datenbank zu speichern.

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

} 

Schließlich eine Suchfunktion, um die Ergebnisse abzurufen. Es verwendet den Kameranamen zum Suchen.

//====================================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.===========") 
} 

Die Sache ist, Abruf bringt ein anderes Ergebnis zu dem, was ich eingegeben habe. Jede Hilfe wird geschätzt. Vielen Dank.

Antwort

1

Wenn irgendeine Hilfe geschätzt wird, würde ich vorschlagen, dass Sie nur Ihren Code neu schreiben, um Bild auf dem Datenträger zu speichern; für mich ist es viel bessere Lösung. Wenn Sie dies tun, kann Ihre DB stattdessen den Pfad zum Bild speichern.

This is cool und einfach zu lernen lib, um Ihnen zu helfen, leicht zu speichern. Allgemeiner Algorithmus ist:

  • eindeutiges Feld
  • Verwendung storeForKey von SDWebImage wählen Bilder für alle Ihre Bilder irgendwo auf der Festplatte speichern
  • Ihr Bildes mit imageForKey abrufen, wenn
  • benötigen
+0

Hmm interessant. Ich werde über diese Option nachdenken. –