2017-06-27 3 views
1

チュートリアルをたくさん読んだが、画像をSQLテーブルに保存できない。私は私の迅速なアプリケーションとsqliteデータベースを接続するためにFMDBフレームワークを使用しています。これは、このオブジェクトを作成して保存する方法です画像をBlobフィールドに保存する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`) 
) 

データベースです

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) 

最後にこれは

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

しかし、このコードは「insertar」機能で使用されるSQL文があります常に失敗します。

答えて

-2

画像自体データベース列に格納することはできませんが、最初に文字列に変換して格納することができます。この文字列はbase64文字列と呼ばれます。私が知る限り、どんなイメージでもそれを逆に変換することができます。

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

今すぐあなたのUIImageオブジェクトを文字列に変換されます。ベース64にエンコードするために

!あなたのDBにstrBase64を保存します。この文字列は非常に長いため、列タイプとしてtextを使用することを忘れないでください。 BLOBも機能します!

UIImageに戻って復号する:

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

これは非効率的で、ベース64のプロセスにおいて33%より大きいPNG表現が(符号化し、それを復号する時間はもちろんする)コードを作ります。 SQLiteはBLOBとしてバイナリデータを直接格納できます – Rob

3

BLOBを挿入するときに、文字列補間を使用してSQLを構築することはできません。 (実際には、あなたが本当にとにかく、SQL文に値を挿入するためにそれを行うべきではありません。)あなたは、あなたのSQLに?プレースホルダを使用して、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) 
} 
関連する問題