Spanish (SOLUCIONADO !!!)JRDC - SQLITE

TheFalcon

Active Member
Licensed User
Longtime User
Perdon por molestar y mas un festivo, llevo unos dias probando JRDC para intentar conectar con SQLite. desde android a PC, he mirado todos los tutoriales habidos y por haber, y no consigo hacer que conecte la APK con la base de datos.
El servidor java me arranca sin problemas

B4X:
Waiting for debugger to connect...
Program started.
SQLite DB's path: \\192.168.1.42\Public, file name: TArticulos.db, create flag: true
Fetching IP address via getLocalHostLANAddress
2023-10-12 12:43:51.125:INFO :oejs.Server:main: jetty-11.0.9; built: 2022-03-30T17:44:47.085Z; git: 243a48a658a183130a8c8de353178d154ca04f04; jvm 11.0.1+13
2023-10-12 12:43:51.209:INFO :oejss.DefaultSessionIdManager:main: Session workerName=node0
2023-10-12 12:43:51.218:INFO :oejsh.ContextHandler:main: Started o.e.j.s.ServletContextHandler@496bc455{/,file:///C:/Users/FRANOR~1/Desktop/otro/JRDCV2~1.01/Objects/www,AVAILABLE}
2023-10-12 12:43:51.238:INFO :oejs.RequestLogWriter:main: Opened C:\Users\FranOrtiz\Desktop\otro\jRDCv2_mod.2020.05.28.01\Objects\logs\b4j-2023_10_12.request.log
2023-10-12 12:43:51.418:INFO :oejs.AbstractConnector:main: Started ServerConnector@6ca8564a{HTTP/1.1, (http/1.1)}{0.0.0.0:17178}
2023-10-12 12:43:51.429:INFO :oejs.Server:main: Started Server@2002fc1d{STARTING}[11.0.9,sto=0] @7637ms
Emulated network latency: 100ms
Modified jRDC is running (version = 2.22)
Note: jRDC is running without V1 support
Bound to: 192.168.1.42:17178

de hecho en la carpeta OBJECT me genera el TArticulos.db-shm y el TArticulos.db-wall.

Pero luego desde la aplicación android no consigo enlazar con la base de datos me dice que no existe. la tengo en la carpeta Public del pc .

Creo que es por que estoy mezclando los tutoriales de Mysql con los pocos que vi de SQLite y ya tengo un cacao de la ostia

si defino :
B4X:
Private const rdcLink As String = "//192.168.1.42/Public/TArticulos.db"

me devuelve

ResponseError. Reason: java.net.SocketTimeoutException: failed to connect to /192.168.1.42 (port 443) from /192.168.1.34 (port 44076) after 30000ms, Response:
Error java.net.SocketTimeoutException: failed to connect to /192.168.1.42 (port 443) from /192.168.1.34 (port 44076) after 30000ms


------
Private const rdcLink As String = "//192.168.1.42:17178/Public/TArticulos.db"

me devuelve

Invalid link: //192.168.1.42:17178/Public/TArticulos.db?method=query2
ResponseError. Reason: java.net.UnknownHostException: Unable to resolve host "invalid-url": No address associated with hostname, Response:
Error java.net.UnknownHostException: Unable to resolve host "invalid-url": No address associated with hostname

Alguien sabría decirme como hacer que conecte la APK a la Base se datos del PC , o algún enlace a un hilo que trate el tema por que ya he agotado todas las opciones.
Muchas gracias y disculpad las molestias.
 

Gabino A. de la Gala

Active Member
Licensed User
Longtime User
Creo estás mezclando conceptos. El jrdc2 es para la parte del servidor y luego desde la apk, haces las llamadas a los recursos que tengas publicados en el lado del servidor. Nunca accedes directamente a la base de datos.
 

TheFalcon

Active Member
Licensed User
Longtime User
Creo estás mezclando conceptos. El jrdc2 es para la parte del servidor y luego desde la apk, haces las llamadas a los recursos que tengas publicados en el lado del servidor. Nunca accedes directamente a la base de datos.
es decir ¿Qué no puedo hacer lo que intento? Insertar un registro en una base de datos en un PC desde una APK? , los 2 evidentemente en la misma red local
 

Gabino A. de la Gala

Active Member
Licensed User
Longtime User
es decir ¿Qué no puedo hacer lo que intento? Insertar un registro en una base de datos en un PC desde una APK? , los 2 evidentemente en la misma red local
Poder puedes, pero siempre que se trate de dispositivos inalámbricos, se suele recomendar no atacar directamente a la base de datos, sino mediante llamadas a procedimientos que están publicados en el servidor.
Si lo que quieres es atacar directamente la base de datos, desde mi manera de ver, no necesitas el jrdc2.

Un ejemplo de jrdc2 muy bueno lo tienes publicado en el siguiente link: https://www.b4x.com/android/forum/threads/tutorial-acceder-a-base-de-datos-con-jrdc2.130278/

El jrdc2 está basado en el servidor que está hecho en b4j y luego los clientes que pueden estar en basados en b4xpages para que el mismo código te pueda servir para b4j, b4a o b4i.

Pero son dos capas diferenciadas: la del servidor que sólo tienen los procedimientos relacionados con la base de datos y la de los clientes que ya tienes la parte visual y las llamadas a los procedimientos del servidor

Y lo bueno es que te vale tanto para trabajar en local como para conexión remota.
 

josejad

Expert
Licensed User
Longtime User
Hola, como bien te comentan, el enlace está mal... tienes que poner
B4X:
'CAMBIA ESTA IP PARA QUE APUNTE A TU SERVIDOR B4J
    Private const rdcLink As String = "http://192.168.1.131:8090/rdc"

Has probado a poner en tu pc en el navegador web

http://localhost:8090/test (cambia 8090 por el puerto que hayas configurado en b4j)
 

TheFalcon

Active Member
Licensed User
Longtime User
Hola, como bien te comentan, el enlace está mal... tienes que poner
B4X:
'CAMBIA ESTA IP PARA QUE APUNTE A TU SERVIDOR B4J
    Private const rdcLink As String = "http://192.168.1.131:8090/rdc"

Has probado a poner en tu pc en el navegador web

http://localhost:8090/test (cambia 8090 por el puerto que hayas configurado en b4j)
El servidor me arranca sin problemas

RemoteServer is running (10/12/2023 18:08:47)
Connection successful.

Lo que no se es como comunicarme con la base de datos
 

TheFalcon

Active Member
Licensed User
Longtime User
Poder puedes, pero siempre que se trate de dispositivos inalámbricos, se suele recomendar no atacar directamente a la base de datos, sino mediante llamadas a procedimientos que están publicados en el servidor.
Si lo que quieres es atacar directamente la base de datos, desde mi manera de ver, no necesitas el jrdc2.

Un ejemplo de jrdc2 muy bueno lo tienes publicado en el siguiente link: https://www.b4x.com/android/forum/threads/tutorial-acceder-a-base-de-datos-con-jrdc2.130278/

El jrdc2 está basado en el servidor que está hecho en b4j y luego los clientes que pueden estar en basados en b4xpages para que el mismo código te pueda servir para b4j, b4a o b4i.

Pero son dos capas diferenciadas: la del servidor que sólo tienen los procedimientos relacionados con la base de datos y la de los clientes que ya tienes la parte visual y las llamadas a los procedimientos del servidor

Y lo bueno es que te vale tanto para trabajar en local como para conexión remota.
Si, ese post de Jose lo he mirado pero al estar para Mysql los ejemplos , no consigo echarlo a andar, o por lo menos a conectar a la base de datos.

Con respecto al modo de trabajar con la base de datos, me da igual que sea directo o mediante procedimientos del servidor.

el modo mas cómodo y fácil ya que no es importante la seguridad no hay nada que robar, el dispositivo Android estaría conectado por wifi a la misma red que el terminal PC
 

TheFalcon

Active Member
Licensed User
Longtime User
parece que me hace algo, ahora el servidor cuando arranco la aplicación en el server java me aparece

B4X:
Command: query: select_grade, took: 10ms, client=192.168.1.34
esa consulta esta en el config del servidor java
B4X:
sql.select_grade=SELECT Nombre FROM Articulos WHERE id = 1

pero no me muestra en ningún sitio el campo recogido, no se si esta bien o no.

en la APP uso el que viene de ejemplo

B4X:
    Dim req As DBRequestManager = CreateRequest
    Dim cmd As DBCommand = CreateCommand("select_grade", Null)
    'Dim cmd As DBCommand = CreateCommand("SELECT Nombre From Articulos Where id = 1", Null)
    wait for (req.ExecuteQuery(cmd,0,Null)) jobdone(j As HttpJob)
    If j.Success Then
        req.handleJobAsync(j, "req")
    wait for (req) rew_Result(res As DBResult)
    req.PrintTable(res)
    Log(res)
    Else
        Log("Error " & j.ErrorMessage)
        End If
        j.release
 

josejad

Expert
Licensed User
Longtime User
jRDC2 es independiente de la bd con la que trabajes. Has puesto en tu app de B4A el enlace que te he puesto? El que tienes está mal... a menos que en el tutorial que hayas visto lo ponga así... qué tutorial estás usando?
 
Last edited:

TheFalcon

Active Member
Licensed User
Longtime User
jRDC2 es independiente de la bd con la que trabajes. Has puesto en tu app de B4A el enlace que te he puesto? El que tienes está mal... a menos que en el titiriteros que hayas visto lo ponga así... qué tutorial estás usando?
si , puse el enlace que me dijiste Private const rdcLink As String = "http://192.168.1.42:17178/rdc"

por eso ahora el servidor java detecta algo
 

TheFalcon

Active Member
Licensed User
Longtime User
Ahora sí te está conectando. Tienes la sub printresult? Si no te sale en el log, quizá no te está devolviendo nada.

Le estás pasando como argumento Null, y tienes que pasarle un id
No Jose, estoy siguiendo el ejemplo , pero no veo el tema de los parametros, y no tengo el sub printresult.
El código Android que tengo es ahora mismo para la consulta y probar

B4X:
Sub Globals
    'These global variables will be redeclared each time the activity is created.
    Type DBResult (Tag As Object, Columns As Map, Rows As List)
    Type DBCommand (Name As String, Parameters() As Object)
    'Private const rdcLink As String = "//192.168.1.42"
    Private const rdcLink As String = "http://192.168.1.42:17178/rdc"
End Sub


Sub Activity_Create(FirstTime As Boolean)
        Activity.LoadLayout("Layout")
        carga_articulos


End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub


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


Sub carga_articulos
    Dim req As DBRequestManager = CreateRequest
    Dim cmd As DBCommand = CreateCommand("select_grade",Null)
    'Dim cmd As DBCommand = CreateCommand("SELECT Nombre From Articulos Where id = 1", Null)
    wait for (req.ExecuteQuery(cmd,0,Null)) jobdone(j As HttpJob)
    If j.Success Then
        req.handleJobAsync(j, "req")
        
    wait for (req) rew_Result(res As DBResult)
        Log(res)
    req.PrintTable(res)
    
    Else
        Log("Error " & j.ErrorMessage)
        End If
        j.release
End Sub

eso es lo unico de codigo que tengo en Android
y en el config solo deje 1 consulta
B4X:
ServerPort=17178

#DATABASE CONFIGURATION
#SQLite
DriverClass=com.sqlite.JdbcUrl
JdbcUrl=jdbc:sqlite:TArticulos.db
#SQLite spcecific. Set CreateFile to create file if it does not exist.
CreateFile=True

sql.select_grade=SELECT Nombre FROM Articulos WHERE id = 1
 

Gabino A. de la Gala

Active Member
Licensed User
Longtime User
¿Tienes abierto el puerto en el firewall del pc que hace de servidor?
¿En el log del B4A, qué te aparece cuando lanzas la consulta?

Suponemos que en la base de datos a la que apuntas en el config.properties existe una tabla artículos con un registro cuya id es un 1.
 

josejad

Expert
Licensed User
Longtime User
SELECT Nombre FROM Articulos WHERE id = 1
Ok, no había visto que tienes la consulta para no recibir parámetros y con un id fijo.
Entiendo que esa consulta te devuelve algo si la haces directamente en un gestor de base de datos.
Esa línea debería mostrarte el registo en la venta de log. No sé, prueba a cambiar el id de la consulta o sube una pequeña base de datos SQLITE con algunos datos para probar, y sube el proyecto B4J y el B4A para que sea más fácil ayudarte.

saludos,
 

TheFalcon

Active Member
Licensed User
Longtime User
¿Tienes abierto el puerto en el firewall del pc que hace de servidor?
¿En el log del B4A, qué te aparece cuando lanzas la consulta?

Suponemos que en la base de datos a la que apuntas en el config.properties existe una tabla artículos con un registro cuya id es un 1.
Si, de hecho si hago la consulta con el gestor de base de datos , la misma que pongo en el java, me devuelve el Nombre correspondiente a la ID 1

En el log no me dice nada
B4X:
Registro conectado a:  realme RMX3151
--------- beginning of main
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create (first time) **
** Activity (main) Resume **
*** Service (httputils2service) Create ***
** Service (httputils2service) Start **
 

TheFalcon

Active Member
Licensed User
Longtime User
Ok, no había visto que tienes la consulta para no recibir parámetros y con un id fijo.
Entiendo que esa consulta te devuelve algo si la haces directamente en un gestor de base de datos.

Esa línea debería mostrarte el registo en la venta de log. No sé, prueba a cambiar el id de la consulta o sube una pequeña base de datos SQLITE con algunos datos para probar, y sube el proyecto B4J y el B4A para que sea más fácil ayudarte.

saludos,
Mañana subo ambos , no llega a entrarme en ese log, cuando llega al req, sale del proceso

B4X:
    Dim req As DBRequestManager = CreateRequest
    Dim cmd As DBCommand = CreateCommand("select_grade",Null)
    'Dim cmd As DBCommand = CreateCommand("SELECT Nombre From Articulos Where id = 1", Null)
    wait for (req.ExecuteQuery(cmd,0,Null)) jobdone(j As HttpJob)
    If j.Success Then
        req.handleJobAsync(j, "req")
        Log(req)
    wait for (req) rew_Result(res As DBResult)
        Log(res)
    req.PrintTable(res)
    
    Else
        Log("Error " & j.ErrorMessage)
        End If
    j.release

wait for (req) rew_Result(res As DBResult) , en esta linea es la ultima parada qeu hace y sale del proceso, de echo le puse delante un log(req) y me devuelve

B4X:
[httputils2service=null, link=http://192.168.1.42:17178/rdc, main=null
, mtarget=class b4a.sqlite.main, starter=null, version=2.0
]

mañana subo la app y el java

A lo que me preguntabais, le tengo firewall desactivado, compartir archivos en red sin clave, etc etc
 

TheFalcon

Active Member
Licensed User
Longtime User
Estás muy cerca

cambiar lo anterior a

B4X:
Wait For (req) req_Result(res As DBResult)

req_ vs rew_
Era eso, muchas gracias, ahora si me devuelve, no se si será que rew es para mysql o que me baje el ejemplo mal.

ahora lo probare en vez de directamente con parametros ( a ver como se hace) y encuanto lo pruebe y funcione, pego todo aqui para el proximo que tenga la duda

B4X:
Registro conectado a:  realme RMX3151
--------- beginning of main
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create (first time) **
** Activity (main) Resume **
*** Service (httputils2service) Create ***
** Service (httputils2service) Start **

Tag: null, Columns: 1, Rows: 1
Nombre   
COCA COLA
 

TheFalcon

Active Member
Licensed User
Longtime User
Bueno aquí subo el proyecto funcionando , con la consulta simple de obtener el Nombre de la ID = 1.
Tanto consulta Directa, como consulta con Parámetro.
ya a raíz de hay cada uno que construya a su gusto las consultas etc.

En mi caso uso como conector java sqlite-jdbc-3.7.2.jar , no lo subo por que no me deja. si alguien lo necesita que me lo pida, aunque supongo que valdría cualquiera.

Espero que a alguien que este perdido, como lo estaba yo le valga esto.

Muchas gracias a todos los que os habéis molestado en ayudarme. No sabéis lo que me habéis ayudado.

Cierro el Post, pero no os librareis de mi, que me surgirá alguna duda mas adelante seguro :p
 

Attachments

  • B4app_v2.rar
    253.8 KB · Views: 66
  • jRDCv2.rar
    111.4 KB · Views: 66
Top