Spanish [SOLUCIONADO] Sincronizando SQLite a mySQL

Duque

Active Member
Licensed User
Longtime User
Bueno creo que lo que me falta es poco para lograr esta tarea con B4A
ya he conseguido mySQL a SQLite
voy por SQLite a mySQL, para esto estoy haciendo un select...
B4X:
dim m as map
dim rs as cursor
dim list1 as list
list1.Initialize
rs= BD.ExecQuery("SELECT * FROM tabla WHERE camp1 >0 order by orden asc")
for i = 0 to rs.RowCount-1
rs.Position=i
M.Put("camp1", RS.GetString("camp1"))
M.Put("camp2", RS.GetString("camp2"))
...
    List1.Add(M)
Next
Dim pack As JSONGenerator
pack.Initialize2(List1)
dim jsn as string
jsn =pack.ToString

Dim Ht As HttpJob
ProgressDialogShow("calmado...")
Ht.Initialize("sinc1", Me)
Ht.Download2(link,Array As String("MyJSON",jsn))

Esto funciona perfectamente con menos de 50 registros, si le doy mas me sale un error de limite que no entiendo muy bien, alguna mano amiga.
 

rscheel

Well-Known Member
Licensed User
Longtime User
Yo envió los datos de uno a uno a la BD MySQL, si el registro se inserta correctamente envió el siguiente, así sucesivamente.
 

rscheel

Well-Known Member
Licensed User
Longtime User
Un ejemplo de envió puede ser el siguiente.

B4X:
'*** Envio de datos eventos a servidor ***'
Sub EnviaEventos
    Dim j As HttpJob
    Dim estado As String
    Dim id_evento As Int
    j.Initialize("", Me) 'name is empty as it is no longer needed
 
    ModConn.s.BeginTransaction
    ModConn.c = ModConn.s.ExecQuery("SELECT * FROM eventos WHERE sync = 1;")
    If ModConn.c.RowCount <> 0 Then
        For i = 0 To ModConn.c.RowCount-1
            ModConn.c.Position = i
            id_evento = ModConn.c.GetInt("id_evento")
            j.download2(ModConn.Url_php_mysql("GET_EVENT"), _
                            Array As String("REQUEST_METHOD", "SAVE_EVENT", _
                                            "ID_EVENTO", ModConn.c.GetInt("id_evento"), _
                                            "ID_TIPOEVENTO", ModConn.c.GetInt("id_tipoevento"), _
                                            "FECHA_INICIO", ModConn.c.GetString("fecha_inicio"), _
                                            "LAT_INI", ModConn.c.GetString("lat_ini"), _
                                            "LONG_INI", ModConn.c.GetString("long_ini"), _
                                            "FECHA_FIN", ModConn.c.GetString("fecha_fin"), _
                                            "LAT_FIN", ModConn.c.GetString("lat_fin"), _
                                            "LONG_FIN", ModConn.c.GetString("long_fin")) _
                        )

            Wait For (j) JobDone(j As HttpJob)
            If j.Success Then
                'The result is a json string. We parse it and log the fields.
                Dim jp As JSONParser
                jp.Initialize(j.GetString)
                Dim quotes As List = jp.NextArray
                For Each quot As Map In quotes
                    estado = quot.Get("estado")
                    If estado == 1 Then
                        ModConn.s.ExecNonQuery2("UPDATE eventos SET sync = ? WHERE id_evento = '" & id_evento & "'", Array As Object(2))
                    Else
                        'ToastMessageShow(quot.Get("mensaje"), False)
                        Log(quot.Get("mensaje"))
                    End If
                Next
            End If
        Next
    End If
    ModConn.c.Close
    ModConn.s.TransactionSuccessful
    ModConn.s.EndTransaction
    'j.Release
    Log("Fin Eventos Enviados")
    EnviaDetalleEventos
End Sub
 

Duque

Active Member
Licensed User
Longtime User
Gracias amigo, Tu método funciona perfecto :cool:
PERO seria mas pirinola enviar todo el array a php y que en php se haga el resto del trabajo, creo que seria mas económico para la aplicación, sobre todo cuando hay tablas que tienen hasta 1.000 registros o mas
 

rscheel

Well-Known Member
Licensed User
Longtime User
Gracias amigo, Tu método funciona perfecto :cool:
PERO seria mas pirinola enviar todo el array a php y que en php se haga el resto del trabajo, creo que seria mas económico para la aplicación, sobre todo cuando hay tablas que tienen hasta 1.000 registros o mas

Yo eso lo realice pensando en enviar solo los registros nuevos o actualizados, no enviar siempre todos.

Lo mismo cuando te traes los datos desde mysql solo traer los datos al teléfono cuando la tabla se aya modificado o actualizado en el servidor, no siempre traer las tablas, solo si es necesario.

Y ojo que todo esto va en un servicio, el cual puede sincronizar datos aunque la app este cerrada.
 

Duque

Active Member
Licensed User
Longtime User
Mi situación es que las app sincronizan cada 15 días o cada mes, ya que son aisladas en los campos, es por eso que acumulan esa cantidad de registros
 

rscheel

Well-Known Member
Licensed User
Longtime User
Mi situación es que las app sincronizan cada 15 días o cada mes, ya que son aisladas en los campos, es por eso que acumulan esa cantidad de registros

Pero puedes sincronizar con el servicio solo cuando aya conexión a internet, yo igual trabajo con aplicaciones sin conexión en terreno, todas estas app sincronizan datos solo cuando hay conexión, sin necesidad de que el usuario intervenga en la sincronización de los datos.

De la misma forma tu tienes que adaptar los códigos que compartimos en el foro a tu necesidad.
 
Top