在 Blob 字段 FMDB 中保存图像
Save image in Blob field FMDB
我已经阅读了很多教程,但我无法将图像保存到 sql table。我正在使用 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)
最后这是sql函数中使用的语句"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()
但是这段代码总是失败。
插入 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)
}
图片本身无法存储到数据库列中,但您可以先将其转换为字符串然后存储。该字符串称为 base64 字符串。据我所知,任何图像都可以转换成那个和相反。
编码为base 64:
let image : UIImage = UIImage(named:"imageNameHere")!
let imageData:NSData = UIImagePNGRepresentation(image)!
let strBase64 = imageData.base64EncodedString(options: .lineLength64Characters)
现在您的 UIImage 对象已转换为字符串!将 strBase64 保存到您的数据库。请记住使用 text
作为列类型,因为此字符串很长。 BLOB 应该也可以!
解码回 UIImage:
let dataDecoded:NSData = NSData(base64EncodedString: strBase64, options: NSDataBase64DecodingOptions(rawValue: 0))!
let decodedimage:UIImage = UIImage(data: dataDecoded)!
我已经阅读了很多教程,但我无法将图像保存到 sql table。我正在使用 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)
最后这是sql函数中使用的语句"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()
但是这段代码总是失败。
插入 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)
}
图片本身无法存储到数据库列中,但您可以先将其转换为字符串然后存储。该字符串称为 base64 字符串。据我所知,任何图像都可以转换成那个和相反。
编码为base 64:
let image : UIImage = UIImage(named:"imageNameHere")!
let imageData:NSData = UIImagePNGRepresentation(image)!
let strBase64 = imageData.base64EncodedString(options: .lineLength64Characters)
现在您的 UIImage 对象已转换为字符串!将 strBase64 保存到您的数据库。请记住使用 text
作为列类型,因为此字符串很长。 BLOB 应该也可以!
解码回 UIImage:
let dataDecoded:NSData = NSData(base64EncodedString: strBase64, options: NSDataBase64DecodingOptions(rawValue: 0))!
let decodedimage:UIImage = UIImage(data: dataDecoded)!