将图像保存在Blob字段FMDB中

时间:2017-06-27 04:04:56

标签: ios swift sqlite fmdb

我已阅读了很多教程,但我无法将图像保存到sql表中。我使用FMDB框架连接我的swift应用程序和sqlite数据库。这是数据库

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)

最后这是函数" insertar"中使用的sql语句。

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

但是这段代码总是失败。

2 个答案:

答案 0 :(得分:4)

插入blob时,不能使用字符串插值来构建SQL。 (实际上,你真的不应该这样做,无论如何都要在SQL语句中插入值。)你应该在SQL中使用?占位符,然后将值作为参数传递给executeUpdate:< / p>

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

答案 1 :(得分:-3)

图像本身不能存储到数据库列中,但您可以先将其转换为字符串然后存储它。该字符串称为base64字符串。据我所知,任何图像都可以转换为相反的图像。

要编码到base 64:

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

现在你的UIImage对象被转换为String!将strBase64保存到您的数据库。请记住使用text作为列类型,因为此字符串非常长。 BLOB也应该有效!

要解码回UIImage:

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