Hola
@amminf yo lo he hecho con el JDBC de Mysql via TCP/IP com.mysql.jdbc.Driver
This is a port of B4J jSQL library. The SQL type was renamed to JdbcSQL and ResultSet was renamed to JdbcResultSet, this allows using it together with the SQL library. SQL library - local SQLite databases. JdbcSQL - Any remote SQL database with a supported JDBC driver. MySQL and MS SQL are...
www.b4x.com
1) Funciona bien! pero tiene unos trucos, para empezar hay que indicar unas cosas en el "manifest" asi:
AddPermission("android.permission.INTERNET")
AddPermission("android.permission.ACCESS_NETWORK_STATE")
2) En la sección o pestaña "Starter" hay que agregar el modulo, y no en "main" como lo indica en el tutorial ya que no te funcionara en "run build"
Starter
Sub Process_Globals
Public mysql As JdbcSQL Private driver As String = "com.mysql.jdbc.Driver"
Private Username As String = "RED"
Private Password As String = "-- tu clave --"
End Sub
3) debes crear todo en forma de funciones dentro del "starter" para poder usar la libreria y llamarlo desde el "main" y pasar parametros via "map" por ejemplo:
-> En "starter"
Sub mysql_ejec_consulta_resultado(mysql_datos As Map) As ResumableSub
Dim mysql_user = mysql_datos.Get("mysql_user_map") As String
Dim mysql_ip = mysql_datos.Get("mysql_ip_map") As String
Dim mysql_db = mysql_datos.Get("mysql_db_map") As String
Dim mysql_consulta = mysql_datos.Get("mysql_consulta_map") As String
Dim mysql_consulta_contar = mysql_datos.Get("mysql_consulta_contar_map") As String
Log("MYSQL JDBC: User: " & mysql_user)
Log("MYSQL JDBC: Ip: " & mysql_ip)
Log("MYSQL JDBC: Db: " & mysql_db)
Log("MYSQL JDBC: Consulta: " & mysql_consulta)
Log("MYSQL JDBC: Consulta contar: " & mysql_consulta_contar)
Dim mysql_resultado As Map
mysql_resultado.Initialize
Log ("MYSQL JDBC: mysql_resultado As Map Inicializado")
mysql.InitializeAsync("mysql", driver, "jdbc:mysql://"& mysql_ip &"/"& mysql_db &"", mysql_user, Password)
Wait For MySQL_Ready (Success As Boolean)
Log ("MYSQL JDBC: Success: " & Success)
mysql_resultado.Put("Success", Success)
If Success = False Then
Log("MYSQL JDBC: Check unfiltered logs for JDBC errors.")
Else
Log ("MYSQL JDBC: Try se ejecuta consulta")
Try
Dim cursor As JdbcResultSet
cursor = mysql.ExecQuery(mysql_consulta)
Log ("MYSQL JDBC: Se ejecuta consulta")
mysql_resultado.Put("Cursor_ResultSet", cursor)
If cursor.NextRow Then
Log ("MYSQL JDBC: Encontrado: " & "Si")
mysql_resultado.Put("Encontrado", "Si")
Else
Log ("MYSQL JDBC: Encontrado: " & "No")
mysql_resultado.Put("Encontrado", "No")
End If
Dim cursor_cont As JdbcResultSet
Log ("MYSQL JDBC: Se ejecuta consulta contar")
cursor_cont = mysql.ExecQuery(mysql_consulta_contar)
If (cursor_cont.NextRow = False) Then
mysql_resultado.Put("contar", 0)
Else
mysql_resultado.Put("contar", cursor_cont.GetInt("CONTAR"))
End If
Catch
Log(LastException)
Log("error de mysql_ejec_consulta_resultado")
mysql_resultado.Put("Encontrado", "No")
End Try
End If
Return mysql_resultado
End Sub
*** Si te das cuenta el resultado de la consulta se devuelve como un mapa de datos -> mysql_resultado As Map ..... entonces ese mapa se captura en el main
-> en "main" como se hace para realizar una consulta
Dim Mysql_consulta As Map
Mysql_consulta.Initialize
Mysql_consulta.Put("mysql_user_map", "RED")
Mysql_consulta.Put("mysql_ip_map", ip_server_local)
Mysql_consulta.Put("mysql_db_map", "productos_2")
Mysql_consulta.Put("mysql_consulta_map", "SELECT CATEGORIA AS CATEGORIAS FROM Lista WHERE CATEGORIA IS NOT NULL GROUP BY CATEGORIA")
Mysql_consulta.Put("mysql_consulta_contar_map", "SELECT COUNT( N.CATEGORIA ) AS CONTAR FROM (SELECT CATEGORIA FROM Lista WHERE CATEGORIA IS NOT NULL GROUP BY CATEGORIA) AS N")
Wait For (CallSub2(Starter, "mysql_ejec_consulta_resultado", Mysql_consulta)) Complete (resultado_consulta As Map)
Dim Success = resultado_consulta.Get("Success") As Boolean
4) Como vez, se puede desglosar los datos almacenados en el "resultado_consulta As Map" con la funcion "Get", entonces es hora de operar con ese mapa del resultado, te dejo un ejemplo. Ten en cuenta que lo que almacenes en el "mapa" de datos en la funcion "Starter" lo podras leer desde "main", por ejemplo en el "map" resultado_consulta, hay un dato llamado "Cursor_ResultSet" que se llena de datos desde la funcion "mysql_ejec_consulta_resultado" en el "Starter" la cual se usa para almacenar los datos... la misma se extrae por medio de :
Dim cursor = resultado_consulta.Get("Cursor_ResultSet") As JdbcResultSet
Te dejo el ejemplo del proceso de uso del mapa de resultado:
If Success = False Then
Msgbox("No se ha encontrado el servidor, por favor verifique su conexión al wifi del local y la configuración. Entrando en -Configuración- encontrará una herramienta para obtener la IP correspondiente al Server Local.","Servidor no encontrado.")
conectar_server_agregar_editar
Else
Dim Encontrado = resultado_consulta.Get("Encontrado") As String
Log("resultado_consulta.Get('Encontrado'): " & resultado_consulta.Get("Encontrado"))
If Encontrado = "Si" Then
Dim cursor = resultado_consulta.Get("Cursor_ResultSet") As JdbcResultSet
Dim l As List
l.Initialize
Dim cant = 0 As Int
Dim ultimo_leido = "-12122#" As String
Do While cursor.GetString("CATEGORIAS") <> ultimo_leido
If cursor.GetString("CATEGORIAS") <> "" Then l.Add(cursor.GetString("CATEGORIAS"))
cant = cant + 1
ultimo_leido = cursor.GetString("CATEGORIAS")
If cursor.NextRow Then
Else
Exit
End If
Loop
Dim Res As Int
Res = InputList(l, "Seleccione la categoria...(" & l.Size & ")", -1)
If Res <> DialogResponse.CANCEL Then
agregar_editar_server_categoria_edittext.Text = l.Get(Res)
End If
End If
End If