Spanish [SOLUCIONADO]Php, MySQL y SQLite

dhernandez

Active Member
Licensed User
Longtime User
Buen dia a todos.

Tengo este pequeño gran detalle, tengo una App, que tiene una base de datos SQLite, que se alimenta de una DB MySQL Remota.

Obtengo los datos para mostrarlo en tiempo real en una lista o una vista y va perfecto, el intermediario que escucha las peticiones está en PHP y va perfecto. Pero no he visto algun ejemplo o tutorial de cómo eso datos, guardarlos en una DB SQLite Local(En el teléfono), para su posterior uso.

En pocas palabras, Extraer los datos del Remoto(MySQL) e insertarlos en Local(Telefono-SQLite), Usando php. Para despues usar esos datos.

Estoy confundido. :(
 

sasetcolombia

Member
Licensed User
Longtime User
Habria que tener en cuenta en que formato esta devolviento los datos el web services en PHP(normalmente JSON o XML).
1.Podrias utilizar okHttpUtils2 para descargarlos
2.Decodificarlos con XMLParser o JSON Parser( dependiendo de como hayas programado tu Web Service).Los datos los tendrias en una Lista
3.Recorrer los datos de la lista y en cada ciclo llamar las consultas tipo INSERT para almacenarlos en un Base de Datos SQLITE
4.Crear las consultar tipo SELECT para extraer los datos,de acuerdo a las tablas y campos que hayas definido.
 

dhernandez

Active Member
Licensed User
Longtime User
Gracias por responder. Estoy tratando de entender los tutoriales y aplicarlos a mi caso, estoy en el paso uno con OkHttpUtils2.
Aun no logro resolverlo me marca el siguiente error.

1581435627608.png

Mi codigo para la transferencia es el siguiente:
Esta rutina lo llamo con un Button.
B4X:
Sub remoteMySQL
    Dim job As HttpJob
    job.Initialize("job", Me)
    job.Download("http://127.0.0.1/01790/dataSend.php")
    wait for JobDone (job As HttpJob)
    If job.Success Then
        Log(job.GetString)
        Else
            Log("Error: " & job.ErrorMessage)
    End If
    job.Release
End Sub


Mi JobDone
B4X:
Sub JobDone (Job As HttpJob)
    Log("JobName = " & Job.JobName & ", Sucess = " & Job.Success)
    If Job.Success = True Then
        Select Job.JobName
            Case "extUser"
                Log(Job.GetString)
        End Select
        Else
            Log("Error: " & Job.ErrorMessage)
            ToastMessageShow("Error: " & Job.ErrorMessage, True)
    End If
    Job.Release
End Sub
 

drgottjr

Expert
Licensed User
Longtime User
¡no y no! todo el código de tu sub "JobDone" va dentro de sub
"remoteMySQL". es éste el propósito de "wait for". el sub "JobDone"
sigue su existencia (el por qué no importa ahora), pero queda vacío.

eso aparte, te refieres a "extUser" como job.jobname, pero no le
pones ese nombre a nadie. donde tienes job.Initialize("job", Me),
"job" es el jobname. "extUser" como job.jobname jamás encontrará
su caso, pues no has nombrado nada así.

vamos por partes con un ejemplo sencillo (si no bastante ineficaz)

B4X:
' esta línea va en otra parte de la app
dim jobnumber as int = 1       ' <---- ejemplo sencillo de un job.  

Sub remoteMySQL
    Dim job As HttpJob
    if jobnumber = 1 then
       job.Initialize("extUser", Me)
    else if jobnumber = 2 then
      job.initialize("job2", Me)
    else if jobnumber = 3 then
       job.initialize("job3", Me)
    end if

    job.Download("http://127.0.0.1/01790/dataSend.php")
    wait for JobDone (job As HttpJob)
    If job.Success Then
        dim input as string = job.GetString
        Log(input)
        select job.jobname
           case "extUser"
              log("ocupándome de job extUser.  va aquí algo al respecto")
           case "job2"
               log("ocupándome de job job2.  va aquí algo al respecto")
           case "job3"
              log("ocupándome de job job3.  va aquí algo al respecto")
        end select
    Else
        Log("Error: " & job.ErrorMessage)
    End If
    job.Release
End Sub

Sub JobDone (Job As HttpJob)
End Sub

la verdad, no hace falta nombrar tu HttpJob, pues sólo tienes uno,
pero suponiendo que vas a tener una serie de "jobs" distintos, he
puesto un select/case como ejemplo para que veas como sale.
todos los jobs los tratas dentro del sub remoteMySQL. adelante.
 

dhernandez

Active Member
Licensed User
Longtime User
Gracias por responderme.
Haré lo que comentas a ver qué sale, andaba todo bien mal jajaja. Comento resultados y gracias de nuevo
 

dhernandez

Active Member
Licensed User
Longtime User
Aqui vengo de nuevo jaja:
Hice como me sugirió @drgottjr pero me salta el mismo error al llamar al httjob. Viendo Bien el codigo de error, creo que falta configurar algo o no sé.

Este es el error que me sigue saltando:
B4X:
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/client/methods/HttpGet;

at anywheresoftware.b4a.http.HttpClientWrapper$HttpUriRequestWrapper.InitializeGet(HttpClientWrapper.java:342)
    at anywheresoftware.b4a.samples.httputils2.httpjob._download(httpjob.java:71)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.shell.Shell.runVoidMethod(Shell.java:777)
    at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:354)
    at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:255)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:144)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:180)
    at anywheresoftware.b4a.debug.Debug.delegate(Debug.java:262)
    at com.cymez.location.main._remotemysql(main.java:580)
    at com.cymez.location.main._btnleer_click(main.java:572)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:732)
    at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:351)
    at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:255)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:144)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:180)
    at anywheresoftware.b4a.BA.raiseEvent(BA.java:176)
    at anywheresoftware.b4a.objects.ViewWrapper$1.onClick(ViewWrapper.java:80)
    at android.view.View.performClick(View.java:6597)
    at android.view.View.performClickInternal(View.java:6574)
    at android.view.View.access$3100(View.java:778)
    at android.view.View$PerformClick.run(View.java:25885)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.http.client.methods.HttpGet" on path: DexPathList[[zip file "/data/app/com.cymez.location-JePtmjEoGbFgrX8Elo5grA==/base.apk"],nativeLibraryDirectories=[/data/app/com.cymez.location-JePtmjEoGbFgrX8Elo5grA==/lib/x86_64, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    ... 32 more
 

drgottjr

Expert
Licensed User
Longtime User
¿cuales son los archivos que incluyes desde el directorio AdditionalLibs? ¿has descargado alguna vez cualquier cosa mediante b4a? será difícil enfrentarte a una tarea mayor sin una base de conocimientos. de momento, no se sabe qué es lo que sabes hacer. cuenta.
 

Attachments

  • include.png
    include.png
    14.7 KB · Views: 199

aeric

Expert
Licensed User
Longtime User
Tengo una muestra
 

DonManfred

Expert
Licensed User
Longtime User
Aun no logro resolverlo me marca el siguiente error.

1581435627608.png

java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/client/methods/HttpGet;

1.
2.
- 28 - The old http SDK is not available by default. This will cause problems with native libraries such as Google Maps who rely on the old SDK. To enable it: https://www.b4x.com/android/forum/t...ar-error-in-android-9-pie.103247/#post-649875
 
Last edited:

dhernandez

Active Member
Licensed User
Longtime User
Gracias a cada uno de ustedes colegas, perdón por mi descuido e ignorancia. Estaba usando en la librería HttpUtils2 y no OkHttpUtils2.
Hago la rutina y me salen los registros en el Log, no todos, porque si son muchos, Miren. Ya con esto, creo que estoy del otro lado.

1581520041737.png
 

dhernandez

Active Member
Licensed User
Longtime User
Tnhks @DonManfred There are many records that I have in the user table.

Log
B4X:
[{"usuario_id":"1","usuario_cve":"[email protected]","usuario_pas":"12345","usuario_nom":"JUAN CARLOS PUGA SANCHEZ"},{"usuario_id":"2","usuario_cve":"[email protected]","usuario_pas":"ty#12345","usuario_nom":"DANIELA DE JESUS HERNANDEZ"},{"usuario_id":"3","usuario_cve":"[email protected]","usuario_pas":"A#12345","usuario_nom":"JAVIER FRANSICO SOBERANES"},{"usuario_id":"4","usuario_cve":"[email protected]","usuario_pas":"12345","usuario_nom":"SIMON SALAZAR HERNANDEZ"},{"usuario_id":"5","usuario_cve":"[email protected]","usuario_pas":"12345","usuario_nom":"GABRIEL MATA"},
B4X:
Message longer than Log limit (4000). Message was truncated.
 

dhernandez

Active Member
Licensed User
Longtime User
Ahora trato de mostrar los registros por separado, siguiendo el ejemplo de Erel. Pero al llamar la rutina, en los Log no me aparece nada.
Mi código es el siguiente:
B4X:
Sub remoteMySQL
    Dim job As HttpJob
    
    job.Initialize("", Me)
    job.Download("http://127.0.0.1/01790/dataSend.php?action=extUser")
    wait for JobDone (job As HttpJob)
    If job.Success Then
        Dim input As String = job.GetString
        Log(input)
        
        Select job.JobName
            Case "extUser"
                'Log(job.GetString)
                Dim parser As JSONParser
                parser.Initialize(job.GetString)
                Dim root As List = parser.NextArray
                For Each colroot As Map In root
                    Dim usuario_nom As String = colroot.Get("usuario_nom")
                    Log(usuario_nom)
                    Dim usuario_id As String = colroot.Get("usuario_id")
                    Log(usuario_id)
                    Dim usuario_cve As String = colroot.Get("usuario_cve")
                    Log(usuario_cve)
                    Dim usuario_pas As String = colroot.Get("usuario_pas")
                    Log(usuario_pas)
                    
                Next
        End Select
        
    End If
    
End Sub
 

dhernandez

Active Member
Licensed User
Longtime User
Gracias a todos, ya me arroja los datos. Estuve revisando y al fin logro obtener datos en el Log.

Así quedó el código:
B4X:
Sub remoteMySQL
   
    Dim job As HttpJob
    job.Initialize("", Me)
    job.Download("http://127.0.0.1/01790/dataSend.php?action=extUser")
    wait for JobDone (job As HttpJob)
    If job.Success Then
           
                Dim nId, uUser, pwdUser, nUser As String
                Dim parser As JSONParser
                parser.Initialize(job.GetString)
                Dim root As List = parser.NextArray
                For i = 0 To root.Size -1
                    Dim User As Map
                    User = root.Get(i)
                   
                    nId = User.Get("usuario_id")
                    uUser = User.Get("usuario_cve")
                    pwdUser = User.Get("usuario_pas")
                    nUser = User.Get("usuario_nom")
                    Log("Id Usuario: " & nId & ", Usuario: " & uUser & ", Pasword: " & pwdUser & ", Nombre: " & nUser)
                Next

    Else
        Log("Error: " & job.ErrorMessage)
    End If
    job.Release
   
End Sub

Aqui el Log con el resultado:
1581550654281.png
 

dhernandez

Active Member
Licensed User
Longtime User
Ahora sólo falta Insertar los resultados de las consultas en las variables nId, uUser, pwdUser, nUser a la tabla Sqlite Local :(, primera vez que trabajo con ésto
 

josejad

Expert
Licensed User
Longtime User
Te toca volver a leer y estudiar :)


saludos,
 

dhernandez

Active Member
Licensed User
Longtime User
jajajaja, de verdad que soy un cabeza dura :(
 

dhernandez

Active Member
Licensed User
Longtime User
Alguien que me oriente? Nomás no doy una :( jajaja
 

drgottjr

Expert
Licensed User
Longtime User
será más fácil practicar con sqlite en windows. funciona igual en windows que en android. incluso la base de datas misma la puedes traspasar de un plataforma a otro. teclado más grande, ninguna compilación, resultados al instante, un mundo de recursos al alcance. empieza así. no vuelvas a tu proyecto b4a hasta dentro de una semana. no te quiero ver más por aquí hasta que no haya resuelto un poco de sqlite. se parece mucho a las demás bases de datos. facilísimo y muy útil. hasta entonces...
 

dhernandez

Active Member
Licensed User
Longtime User
Insertar, borrar, y todo eso en Sqlite y otras bases de datos por separado se hace perfecto. Pero coger los resultados obtenidos del php e insertarlos en Sqlite no encuentro la manera, intenté esto y no hay manera.
B4X:
Dim nId, uUser, pwdUser, nUser As String
                Dim parser As JSONParser
                parser.Initialize(job.GetString)
                Dim root As List = parser.NextArray
                For i = 0 To root.Size -1
                    Dim User As Map
                    User = root.Get(i)
                    
                    nId = User.Get("usuario_id")
                    uUser = User.Get("usuario_cve")
                    pwdUser = User.Get("usuario_pas")
                    nUser = User.Get("usuario_nom")
                    
                    'lstView.AddTwoLines(nId, uUser)
                    Starter.sql.AddNonQueryToBatch("INSERT INTO usuarios VALUES(?,?,?,?)", Array(nId, uUser, pwdUser, nUser))
                                    
                Next
no se insertan :(
 
Top