2017-06-27 1 views
1

Ich habe viele Tutorials gelesen, aber ich kann ein Bild nicht in einer SQL-Tabelle speichern. Ich verwende das FMDB-Framework, um meine schnelle App und die SQLite-Datenbank zu verbinden. Dies ist die DatenbankBild in BLOB Feld speichern FMDB

CREATE TABLE "PRODUCTO" (
    `CODIGOPRODUCTO` integer NOT NULL PRIMARY KEY AUTOINCREMENT, 
    `CODIGOCATEGORIA` integer NOT NULL, 
    `NOMBREPRODUCTO` varchar(50) NOT NULL, 
    `DESCRIPCIONPRODUCTO` varchar(50) NOT NULL, 
    `IMAGEN` BLOB, 
    FOREIGN KEY(`CODIGOCATEGORIA`) REFERENCES `CATEGORIA`(`CODIGOCATEGORIA`) 
) 

dies ist der Weg zu schaffen und

let newPr: Producto = Producto() 
newPr.nombre = txtNombre.text! 
newPr.descripcion = txtDescripcion.text! 
newPr.idCategoria = Int(categoriaSel.id) 
newPr.imagen = imageView.image! 
Producto().insertar(itemProducto: newPr) 

das Objekt speichern Schließlich ist diese SQL-Satz in der Funktion "insertar"

conexion.database!.open() 
     let consulta: Bool = conexion.database!.executeUpdate("insert into PRODUCTO (CODIGOCATEGORIA,NOMBREPRODUCTO,DESCRIPCIONPRODUCTO, IMAGEN) values (\(itemProducto.idCategoria),'\(itemProducto.nombre)','\(itemProducto.descripcion)', \(UIImagePNGRepresentation(itemProducto.imagen)! as NSData))", withArgumentsIn: nil) 
     conexion.database!.close() 

Aber dieser Code scheitert immer.

Antwort

-2

Bild selbst kann nicht in einer Datenbankspalte gespeichert werden, aber Sie können sie zuerst in eine Zeichenfolge konvertieren und dann speichern. Die Zeichenfolge heißt Base64-Zeichenfolge. Soweit ich weiß, kann jedes Bild umgekehrt und umgekehrt konvertiert werden.

Um zur Basis 64 kodieren:

let image : UIImage = UIImage(named:"imageNameHere")! 
let imageData:NSData = UIImagePNGRepresentation(image)! 
let strBase64 = imageData.base64EncodedString(options: .lineLength64Characters) 

Jetzt ist Ihre UIImage-Objekt in einen String umgewandelt wird! Speichern Sie strBase64 in Ihrer Datenbank. Denken Sie daran, text als Spaltentyp zu verwenden, da diese Zeichenfolge sehr lang ist. BLOB sollte auch funktionieren!

Um zu UIImage zu dekodieren zurück:

let dataDecoded:NSData = NSData(base64EncodedString: strBase64, options: NSDataBase64DecodingOptions(rawValue: 0))! 
let decodedimage:UIImage = UIImage(data: dataDecoded)! 
+1

Dies ist ineffizient, die Darstellung PNG macht 33% größer in dem Prozess der Basis 64 codierende (nichts von der Zeit, zu sagen, dass es zu kodieren und zu dekodieren) . SQLite kann Binärdaten direkt als BLOBs speichern – Rob

3

Beim Einfügen von Blobs können Sie keine Zeichenfolgeninterpolation zum Erstellen des SQL verwenden. (In der Tat, sollten Sie wirklich nicht tun, dass die Werte in SQL-Anweisungen einzufügen, sowieso.) Sie ? Platzhalter in der SQL verwenden sollten, und geben Sie dann die Werte als Parameter von executeUpdate:

do { 
    try conexion.database!.executeUpdate("insert into PRODUCTO (CODIGOCATEGORIA,NOMBREPRODUCTO,DESCRIPCIONPRODUCTO, IMAGEN) values (?, ?, ?, ?)", values: [itemProducto.idCategoria, itemProducto.nombre, itemProducto.descripcion, UIImagePNGRepresentation(itemProducto.imagen)!]) 
} catch { 
    print(error) 
}