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.
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:
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"
- 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:
- Edita el archivo config.properties que está ubicado en la pestaña "Archivos".
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:
¡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)
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
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,
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"
- MySQL driver: http://dev.mysql.com/downloads/connector/j/
- Para SQL Server puedes usar este proyecto open source: http://jtds.sourceforge.net/
- 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
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: