Spanish [TUTORIAL] Acceder a base de datos con jRDC2

josejad

Expert
Licensed User
Longtime User
Hola, este tutorial es en parte una traducción del tutorial original y en parte algunas anotaciones mías.

En principio, hay tres formas de acceder a bases de datos desde una app B4X.
Las enumero con un enlace a los tutoriales en inglés.

1.- jdbcSQL Es una conexión directa desde la app al servidor SQL.
Tiene algunas desventajas:​
- Insegura: Sería simple para un hacker obtener el usuario y la contraseña y acceder directamente a tu base de datos.​
- Difícil de mantener: Los cambios en el diseño de la base de datos, requieren actualizar la app​
- Problemas de rendimiento: Los drivers Jdbc no están optimizados para dispositivos móviles.​
- Problemas de fiabilidad debido a una conexión inestable​
- Sólo se recomienda para aplicaciones caseras, etc...​
2.- Webservices: Básicamente consiste en un servidor web, al que le puedes hacer consultas y te devuelve los resultados desde una página PHP, ASP.NET, etc...
3.- jRDC2: Es la forma recomendada por Erel para acceder a base de datos y sobre la que nos centraremos en este tutorial.

Las ventajas de jRDC2 son:
  • Soporta la mayoría de las bases de datos
  • Mejor rendimiento
  • Las consultas SQL están configuradas en el servidor, lo cual es más seguro.
  • Soporta todo tipo de consultas, incluidas consultas BATCH (por lotes)
  • Soporta BLOB's

jRDC2 consta de dos partes:
1.- Una app servidor hecha en B4J que recibe las peticiones de los clientes, ejecuta los comandos SQL en la base de datos, y devuelve los resultados
2.- Un módulo cliente, que se puede usar en B4A, B4i o B4J.

Por tanto, para usar jRDC2, necesitas ejecutar la aplicación servidor (un archivo .jar) en un servidor. Es decir, no te vale con tener un hosting web con una base de datos MariaDB, por ejemplo. Necesitas un VPS (un servidor privado virtual) en el que poder ejecutar la aplicación servidor (.jar)
Lo que hacemos, es tener ejecutándose la aplicación servidor habitualmente en el mismo servidor que la base de datos, la aplicación servidor recibe las peticiones de nuestra aplicación (ya sea Android, iOS o escritorio), hace la consulta a la base de datos, y devuelve los resultados.

CONFIGURACIÓN DE LA APLICACIÓN SERVIDOR (EN B4J, NO EL SERVIDOR LINUX O WINDOWS QUE EJECUTARÁ FINALMENTE EL .JAR)

Lo primero que necesitamos es un conector java que conecte a nuestra base de datos
- Descarga los drivers jdbc para tu base de datos, buscando en Google "tu_base_de_datos JDBC driver"
- Añade el fichero JDBC .jar descargado a la carpeta de librerías adicionales de B4J
- Descarga el código fuente del servidor B4J del tutorial jRDC2 (o directamente de AQUÍ)
- Añade (más bien, modifica en el programa que has descargado) la referencia al archivo .jar con:
B4X:
#AdditionalJar: mysql-connector-java-5.1.27-bin
- Edita el archivo config.properties que está ubicado en la pestaña "Archivos".

B4X:
#Lines starting with '#' are comments.
#Backslash character at the end of line means that the command continues in the next line.

#CONFIGURACIÓN DE LA BASE DE DATOS
DriverClass=com.mysql.jdbc.Driver  'El archivo que has descargado
JdbcUrl=jdbc:mysql://localhost:3306?characterEncoding=utf8&useSSL=false   'localhost en este caso, ya que la base de datos y el servidor jRDC2 están en el mismo ordenador. Debe apuntar a tu servidor de BBDD (pueden estar en servidores diferentes)
User=usuario_bd
Password=clave_bd
#Java server port
ServerPort=8090 'El puerto en el que el servidor B4J escuchará las peticiones. Recuerda abrirlo en tu firewall

'Aquí irán las consultas SQL que quieras hacer. Los signos de interrogación, son los parámetros que enviarás desde la aplicación cliente.
#sql.Login = SELECT * FROM B4X.users WHERE `username` = ? AND `password` = md5(?)
sql.getEvents = SELECT * FROM B4X.events WHERE `month` = ? AND `id_user` = ?
sql.updateEvents = UPDATE B4X.events SET `month`=?,`event_type`=?,`description`=?, `value` = ? WHERE `id` = ?
sql.deleteEvents = DELETE FROM B4X.events WHERE `id` = ?
sql.addEvents = INSERT INTO B4X.events(`id_user`, `month`, `event_type`, `description`, `value`) VALUES (?, ?, ?, ?, ?)

Una vez que has configurado todo, ejecuta la aplicación B4J.
Para probar si funciona escribe en tu navegador: http://localhost:8090/test (o el puerto que hayas configurado)
Si todo va bien deberías ver en el navegador:

B4X:
RemoteServer is running (04/29/2021 20:21:31)
Connection successful.

¡Enhorabuena, eso quiere decir que tu servidor B4J ha logrado comunicarse con tu servidor de base de datos. Ahora ya podemos acceder a él desde tu aplicación

CONFIGURACIÓN CLIENTE (B4A en este caso)


1.- Añade en MAIN (debe ser en MAIN)

B4X:
Sub Process_Globals
   Type DBResult (Tag As Object, Columns As Map, Rows As List)
   Type DBCommand (Name As String, Parameters() As Object)
   Private const rdcLink As String = "http://192.168.0.6:8090/rdc"
End Sub

Cambia rdcLink con la dirección ip de tu servidor jRDC2, y el puerto que hayas configurado en config.properties (ip:puerto/rdc). DEBE terminar en rdc
OJO, la dirección de tu servidor jRDC2. Por ejemplo, si estás ejecutando B4J en tu PC con la ip 192.168.0.34, es esta la dirección que debes poner.

2.- Debes añadir a tu proyecto la clase DBRequestManager (está en el hilo original, o lo puedes descargar de AQUÍ)
Depende de las librerías RandomAccessFile y OkHttpUtils2 (o las correspondientes en B4J o B4i)

3.- Añade estas dos subs a tu proyecto
B4X:
Sub CreateRequest As DBRequestManager
   Dim req As DBRequestManager
   req.Initialize(Me, rdcLink)
   Return req
End Sub

Sub CreateCommand(Name As String, Parameters() As Object) As DBCommand
   Dim cmd As DBCommand
   cmd.Initialize
   cmd.Name = Name
   If Parameters <> Null Then cmd.Parameters = Parameters
   Return cmd
End Sub

Puedes ver un ejemplo funcionando de cómo hacer las peticiones en ESTE HILO.

Una vez que tienes todo configurado, ejecuta de nuevo B4J en modo release. Esto genera un archivo .jar en la carpeta Objects. Este es la aplicación servidor que debes ejecutar y a la que tus aplicaciones se conectarán.

Puedes ver cómo ejecutarla en un VPS en ESTE TUTORIAL.

Recuerda en tu aplicación (B4A, B4i o B4J modificar la dirección a tu servidor jRDC2, que antes era la IP local de tu PC, y ahora será una dirección de internet)

Si haces pruebas y no te funcionan, por favor, abre un hilo nuevo, pon tu código, tus logs e intentaremos ayudarte.

saludos,
 
Last edited:
@José Aguilar si sólo utilizo un webservice, el tema de seguridad aún sigue siendo el punto débil de la conexión con la db????
 

josejad

Expert
Licensed User
Longtime User
Perdona, creo que como no estás registrado, no me llegan notificaciones de tus respuestas.

utilizo un webservice, el tema de seguridad aún sigue siendo el punto débil de la conexión con la db????

No tiene por qué, pero hay que hacerlo de forma segura, usando sentencias preparadas, tokens, etc...
Si usas algún framework a veces traen ya una API para comunicarte que implementa seguridad.

De todas formas, aquí me pierdo ya un poco más.
 

Sergio Castellari

Active Member
Licensed User
Hola @José J. Aguilar !! (tanto tiempo!...estoy retomando la programación en B4X...tengo algunas horas libres !!!)

Felicitaciones y GRACIAS por el aporte del tutorial. Me sirvió para "recordar" algunos temas y retomar un proyecto pendiente.
Aparte: Me tengo que poner al día con el tema B4XPages...ya que tengo mi diseño basado en el esquema anterior...aunque por lo que veo no afecta en nada a jRDC2.

Un abrazo fuerte y deseando que todo este bien con tu gente querida (más aun por el tema COVID)
 

josejad

Expert
Licensed User
Longtime User
Gracias Sergio¡¡

Por aquí andaremos para lo que necesites.

Todo bien por aquí, ahora mismo encerrado en mi habitación positivo por COVID, pero ha sido suave, espero que por allí todos bien.

Un abrazo
 

Sergio Castellari

Active Member
Licensed User
Gracias Sergio¡¡

Por aquí andaremos para lo que necesites.

Todo bien por aquí, ahora mismo encerrado en mi habitación positivo por COVID, pero ha sido suave, espero que por allí todos bien.

Un abrazo
uuuu!!! Justo te agarró ahora ??? que mala suerte!!!...lo importante que me estas contando que no tiene sintomas complicados y eso es GENIAL!...¿Estas vacunado?...
De aqui va toda mi energia positiva!!!!

Si si, seguramente comenzaré con las preguntas! ja

Abrazossss!
 
Top