Spanish [SOLUCIONADO] Pasar foto de MYSQL a SQLite

Edu Portu

Member
Licensed User
Longtime User
Hola a todos,

Tengo una pequeña base de datos MYSQL que quiero pasar a SQLite mediante JSON...

Hasta ahora ha funcionado correctamente pero ahora quiero añadirle una foto a la BD, la foto en MYSQL la gestiono correctamente, pero a la hora de cargarla en SQLite parece que no funciona...

Hay que hacer algo especial?

La paso como un campo mas, pero luego al editar la BD de SQLite me pone NULL en el campo de la foto...

Saludos y gracias
Edu
 
Last edited:

dar2o3

Active Member
Licensed User
Longtime User
Que tipo de campo estás usando en sqlite? para imágenes es necesario usar el tipo de campo blob (imagino que ya lo sabes.)

Aunque ya se a escrito por aquí que no es lo mas adecuado, me refiero a guardar imágenes en la base de datos, "lo suyo" es guardar las imágenes en una directorio aparte y en la bd guardar solo el path a la imagen.
 

samperizal

Active Member
Licensed User
Longtime User
Saludos.


Yo lo en solucionado con la libreria MSMySql lo hace en los dos sentidos.

MySql a Sqlite
Sqlite a Mysql


espero que te sirva
 

dar2o3

Active Member
Licensed User
Longtime User
Muchas gracias por el aviso, voy a echarle un ojo a esa librería.
 

Edu Portu

Member
Licensed User
Longtime User
Lo que hago es una consulta con JSON que me devuelve una lista de pares con los campos de la BD MYSQL.

Para recuperar esos datos uso lista.Get(indice), que no tengo problema con campos numericos o de texto, pero que no se como usar con campos BLOB, en este caso una imagen...
 

Edu Portu

Member
Licensed User
Longtime User
He probado a mostrar la foto segun la descargo con el JSON al InputStream y se ve perfectamente, asi que ahi no esta el problema...

El problema esta que al intentar guardar la foto en SQLITE con

B4X:
Dim su As StringUtils
Dim ImageBytes() As Byte = su.DecodeBase64(m.Get("Foto"))
Dim InputStream1 As InputStream
InputStream1.InitializeFromBytesArray(ImageBytes, 0, ImageBytes.Length)
                            
Dim OutputStream1 As OutputStream
OutputStream1.InitializeToBytesArray(1000)
File.Copy2(InputStream1, OutputStream1)
                                              
Dim Buffer() As Byte 'declares an empty array
Buffer = OutputStream1.ToBytesArray  
                                          
SQLDFAV.ExecNonQuery("INSERT INTO rutas VALUES ('" & DateTime.Date(FRuta) & "','" & Array As Object(Buffer)  & "' )")

Lo que me graba en el campo FOTO no es una cadena de bytes con la foto si no algo asi como el texto

[Ljava.lang.Object;@416e5530

que estoy haciendo mal?
 

dar2o3

Active Member
Licensed User
Longtime User
La base de datos nunca te va a guardar la "imagen en sí" te guarda el conjunto de datos que conforman la imagen, lo suyo es que la guardas en formato base64 sin decodificar, la decodificas al recuperar los datos de la bd y ya puedes mostrar/usar la imagen.
 

samperizal

Active Member
Licensed User
Longtime User
Saludos.

A mi me funciona guardando la imagen en un archivo temporal temporal y luego ejecuto el código adjunto y elimino la imagen temporal
 

Attachments

  • imagen_to_sqlite.txt
    676 bytes · Views: 309

Edu Portu

Member
Licensed User
Longtime User
Al final lo he solucionado haciendo como decia dar2o3, guardo la imagen en SQLITE en base64 tal y como me la descargo de MYSQL... Y despues cuando quiero mostrarla cojo el string en base64 de SQLITE y lo decodifico y convierto en un bitmap con esta rutina que encontre:

B4X:
Sub Base64StringToImage(s As String) As Bitmap
   Dim su As StringUtils
   Dim s2 As String
   Dim n As Int
   n = s.IndexOf(",")
   If n < 0 Then
      s2 = s
   Else
      s2 = s.SubString(n+1)
   End If
   Dim bytes() As Byte = su.DecodeBase64(s2)
   Dim In As InputStream
   In.InitializeFromBytesArray(bytes, 0, bytes.Length)
   Dim bmp As Bitmap
   bmp.Initialize2(In)
   In.Close
   Return bmp
End Sub

Gracias a todos por vuestra ayuda.
 

rscheel

Well-Known Member
Licensed User
Longtime User
Y por que lo haces de ese modo, no se recomienda guardar imágenes en la BD, lo que deberías hacer es guardar la ruta de la imagen en un campo, y tener una carpeta de imágenes en el servidor con nombre x y otra en el teléfono con nombre x y esto manejar lo con ftp, esta practica seria la correcta, mas aun si estas utilizando un teléfono móvil, recuerda que mientras menos recurso ocupes tu aplicación andará mucho mejor en distintos equipos.

Saludos.
 

Edu Portu

Member
Licensed User
Longtime User
Me imagino que no se recomendara guardar imaganes en la BD si son muy grandes... En esta caso son pequeñas, por lo que solo ocupan unos pocos de kb cada una, y no son muchas (unas 50 al año), asi el acceso es mas rapido y no hay que andar descargando las fotos por ftp (con lo que no estarian disponibles si no tienes cobertura)
 
Top