|
||
|
![]() |
![]() |
Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
![]() |
|
Herramientas |
#1
|
||||
|
||||
Sincronizar sqlite
Hola,
voy a empezar a desarrollar una base de datos y necesito vuestra ayuda para enfocarlo. Vamos a usarla dos personas, cada uno con su tablet. Quiero que los dos podamos acceder a los registros del otro, pero que no necesitemos estar conectados a internet en el momento de usar la base de datos (a los registros del mismo día no hace falta, con sincronizar por las noches me valdría). Opciones: - Sincronizar de alguna manera las dos bases de datos. Si sólo una de las dos se utilizase cada día sería sencillo (enviar el "datos.db" al otro dispositivo y listo). El problema es que los dos modifiquemos la base de datos: ¿cómo podemos sincronizar? ¿hay alguna manera de hacer esto? ¿o alguna aplicación o algún servidor que junte las dos, las actualice y nos las devuelva integradas? - Que la aplicación acceda a dos bases de datos, "a" y "b", con la misma estructura y todo exactamente igual pero cada una con los datos de uno de nosotros. Sería tan sencillo como intercambiarnos el archivo .db cada noche, o en el momento que necesitemos actualizarnos (yo le mando "a.db" y él me manda "b.db"). Contras: si yo ("a") visito a un cliente de "b" y actualizo su registro, voy a tener el mismo problema que en el caso anterior. Yi si lo meto en "a" va a ser un lío luego saber dónde está la info. Agradecería cualquier respuesta positiva o negativa. Para mí sería más sencillo hacer una base de datos online a la que accedamos los dos, pero en algunos lugares no hay buena cobertura de datos y no quiero quedarme tirado (escribir me da igual, pero tengo que poder consultar en todo momento). Sugerencias por favor... Gracias!!! |
|
#2
|
||||
|
||||
El bloqueo de registros es crucial en las bases de datos. yo enfocaría el tema con una base de datos online, por ejemplo con fusión tables, aunque eso es a gusto de cada cual, y en cada tableta dos temporales. La actualización la completo de las temporales a la online, pero por cada registro añado un campo más de tipo fecha/hora y añadiría el registro más antiguo en caso de haber modificaciones en ambos. Con una sentencia Sql que ejecutaría en las tablets y el condicionante fecha/hora creo q podría funcionar.
Saludos. Enviado desde mi GT-I9001 usando Tapatalk |
#3
|
||||
|
||||
Lo que comentas es mucho más cómodo y fácil hacerlo con una base de datos compartida en Internet y, por lo tanto, con los telefonos conectados siempre. Cualquier otro intento va a acabar induciendo a errores. Si visitais al mismo cliente, los datos que se crucen despues serán incorrectos... uno acaba sobreescribiendo a otro. De forma online, tendriais la informacion en tiempo real.
__________________
Por respeto a los demas:
Y, en general, trata a todo el mundo como te gusta a ti que te traten. |
#4
|
||||
|
||||
Gracias a los dos por las respuestas.
@iliberis lo de los teléfonos conectados siempre no puedo hacerlo, necesito poder acceder a los datos en casas sin buena cobertura (que, créeme, en pueblos son bastantes). En ningún caso vamos a modificar al mismo cliente en un mismo intervalo de actualización (si va uno, no va el otro). @future21 lo de la base de datos online, ¿sería para consultarla online, o podría descargarla fácilmente? (no tengo ni idea de fusion tables, ahora lo busco). He pensado como alternativa generar un archivo temporal en cada tablet que incluya todas las sentencias de edición que ejecute (insert, update...). Para actualizar, sólo tenemos que enviar el archivo al otro terminal y ejecutarlo (supongo que podrá hacerse, ¿no? algo similar al "include" de php). En el momento de enviar el archivo, se resetea y empieza un nuevo con los cambios desde ese momento. Todo eso podría automatizarlo con una opción de "sincronizar" que mande el archivo a un server de internet y descargue los nuevos que encuentre del otro terminal. ¿Lo veis descabellado? He encontrado la función update_hook que guarda esos update/insert pero no termino de encontrar información clara sobre ella. Si funciona bien, supongo que será más sencillo que hacerlo a mano (que cada vez que haga una consulta, la copie manualmente al fichero). Para evitar problemas al sincronizar nuevos insert, asignaría rangos de ID para cada dispositivo (aún no sé cómo puede hacerse en sqlite, pero a unas malas asigno el valor de una variable y la autoincremento en cada insert). Nuevamente cualquier comentario será bienvenido. Muchas gracias. Saludos. |
#5
|
||||
|
||||
Gracias a los dos por las respuestas.
@iliberis lo de los teléfonos conectados siempre no puedo hacerlo, necesito poder acceder a los datos en casas sin buena cobertura (que, créeme, en pueblos son bastantes). En ningún caso vamos a modificar al mismo cliente en un mismo intervalo de actualización (si va uno, no va el otro). @future21 lo de la base de datos online, ¿sería para consultarla online, o podría descargarla fácilmente? (no tengo ni idea de fusion tables, ahora lo busco). ![]() He pensado como alternativa generar un archivo temporal en cada tablet que incluya todas las sentencias de edición que ejecute (insert, update...). Para actualizar, sólo tenemos que enviar el archivo al otro terminal y ejecutarlo (supongo que podrá hacerse, ¿no? algo similar al "include" de php). En el momento de enviar el archivo, se resetea y empieza un nuevo con los cambios desde ese momento. Todo eso podría automatizarlo con una opción de "sincronizar" que mande el archivo a un server de internet y descargue los nuevos que encuentre del otro terminal.
¿Lo veis descabellado? He encontrado la función update_hook que guarda esos update/insert pero no termino de encontrar información clara sobre ella. Si funciona bien, supongo que será más sencillo que hacerlo a mano (que cada vez que haga una consulta, la copie manualmente al fichero). Para evitar problemas al sincronizar nuevos insert, asignaría rangos de ID para cada dispositivo (aún no sé cómo puede hacerse en sqlite, pero a unas malas asigno el valor de una variable y la autoincremento en cada insert). Nuevamente cualquier comentario será bienvenido. Muchas gracias. Saludos. ![]() En cualquier caso, cada vez que realices un INSERT o UPDATE puedes, al mismo tiempo, exportar la consulta y sus parametros a un TXT para luego subirlo al servidor. Es más simple que buscar funciones que hagan algo similar. De esa forma, en vez de grabar los datos en el servidor y luego consultarlos desde el telefono, que requeriria Internet siempre, lo puedes hacer en momentos puntuales. Yo dejaría la base de datos del servidor como principal y, cada X tiempo (podemos poner una vez al dia), me la descargaría al telefono. Del mismo modo, al final del dia, enviaria al servidor solo los cambios. Ademas, un campo en la tabla que indique QUIEN y CUANDO se han hecho esos cambios. Si hay diferencias importantes (por ejemplo, dos personas han hecho cambios en el mismo registro), las confirmaria a mano, avisando con un mensaje y mostrando los cambios, para decidir en el momento cual de los registros es el bueno. De esa forma se ahorra en conexiones, complejidad, y problemas.... muchos problemas.
__________________
Por respeto a los demas:
Y, en general, trata a todo el mundo como te gusta a ti que te traten. |
#6
|
||||
|
||||
Bueno... la alternativa que propones viene a ser una forma similar de actualización de la base de datos. Del mismo modo, necesitas conectar los dispositivos, y lo mejor para eso es usar un servidor. Puedes enviar la BD entera y que en el servidor se comparen las dos... o sencillamente hacerte un "log" de consultas (tal y como propones) que haga algo parecido. Para mi seria más facil comparar las tablas... pero seria segun el caso concreto.
![]() ¿Hay manera de enviar la base de datos y que se comparen? Eso sería la leche, sin log ni nada. Sincronizaríamos por wifi así que no habría problema por el tráfico de datos. Lo que pasa es que si sincronizamos dos personas, ¿cómo sabe el servidor (al actualizar la segunda) si debe añadir los datos nuevos al tablet, o eliminarlos del servidor? Si lo compara bien sería mucho más simple, pero me preocupa eso. Lo del log probablemente lo haga así (a mano con cada consulta), porque no encuentro info del update_hook (llevo un rato buscando y nada, así que ya paso de perder tiempo teniendo otra solución sencilla aunque menos "bonita"). Gracias!! |
#7
|
||||
|
||||
Ademas, un campo en la tabla que indique QUIEN y CUANDO se han hecho esos cambios. Si hay diferencias importantes (por ejemplo, dos personas han hecho cambios en el mismo registro), las confirmaria a mano, avisando con un mensaje y mostrando los cambios, para decidir en el momento cual de los registros es el bueno.
![]() |
#8
|
||||
|
||||
¿Cómo las comparas? Supongo que debería esperar a que subamos los dos el archivo del día, pero ¿cómo hago para comparar si los dos hemos realizado una modificación en el mismo registro? (supongo que eso lo haría en php en el servidor, ¿no?). Ahí me pierdo, no tengo ni idea...
![]() Saludos. P.D.: Los cambios en el servidor los haces por ejemplo en php con una sentencia SQL de la foma UPDATE <BDonline> SET <campo="valorBDtemporal",.... campo2="valor2BDTemporal"> WHERE BDtemporal.fecha>fecha (esto para el caso de que quieras solo modificar registros con fecha mayor en la temporal que en la online, sin embargo, prueba la sentencia SQL, no la he probado pero supongo que funcionaria). Última edición por future21 Día 21/11/11 a las 10:56:03. |
#9
|
||||
|
||||
Pues si, algo así. Aunque yo añadiría otro punto: Si los dos usuarios han actualizado el mismo registro, yo mostraria en pantalla los dos, y permitiria seleccionar al usuario cual de ellos es el que debe conservarse. Mas que nada porque hay veces en las que la actualizacion mas antigua puede ser la valida.
Pero, vamos, la idea es la misma, y mejor expresada no puede estar ya.
__________________
Por respeto a los demas:
Y, en general, trata a todo el mundo como te gusta a ti que te traten. |
#10
|
||||
|
||||
Vale, gracias a los dos. Estoy gilip.., no se me había ocurrido que al poner la fecha en la temporal, añadiría también ese campo a la online para comparar... Ainsss!!!!
Lo de fusion tables lo estoy investigando, no encuentro la forma de actualizarlas sin entrar en google manualmente (he visto la API de sql, pero para ejecutarla necesito tener una web subida para que lo haga, ¿no? ¿o podría hacerlo desde la propia aplicación conectando con la base de datos online?). Esto no me preocupa demasiado, a las malas uso un alojamiento que tengo en otro servidor. Y ya para asegurarme. Lo que proponeis es que al actualizar me conecte a la web, la bloquee, la actualice con mi archivo log.txt, y la descargue COMPLETA de nuevo ¿no? Por si os estoy entendiendo mal. Gracias de nuevo, me habeis ayudado mucho!! |
#11
|
||||
|
||||
Pues si, algo así. Aunque yo añadiría otro punto: Si los dos usuarios han actualizado el mismo registro, yo mostraria en pantalla los dos, y permitiria seleccionar al usuario cual de ellos es el que debe conservarse. Mas que nada porque hay veces en las que la actualizacion mas antigua puede ser la valida.
Pero, vamos, la idea es la misma, y mejor expresada no puede estar ya. ![]() Saludos. |
#12
|
||||
|
||||
Vale, gracias a los dos. Estoy gilip.., no se me había ocurrido que al poner la fecha en la temporal, añadiría también ese campo a la online para comparar... Ainsss!!!!
Lo de fusion tables lo estoy investigando, no encuentro la forma de actualizarlas sin entrar en google manualmente (he visto la API de sql, pero para ejecutarla necesito tener una web subida para que lo haga, ¿no? ¿o podría hacerlo desde la propia aplicación conectando con la base de datos online?). Esto no me preocupa demasiado, a las malas uso un alojamiento que tengo en otro servidor. Y ya para asegurarme. Lo que proponeis es que al actualizar me conecte a la web, la bloquee, la actualice con mi archivo log.txt, y la descargue COMPLETA de nuevo ¿no? Por si os estoy entendiendo mal. Gracias de nuevo, me habeis ayudado mucho!! ![]() Saludos. |
#13
|
||||
|
||||
OK gracias. Ya la última y no os doy más la tabarra.
¿Cómo se asignan rangos de ID en sqlite? Porque en algún sitio leí que se hacía, pero en ningún sitio encuentro cómo (sólo algo de usar el autoincrement y meter manualmente el primer valor de ID, pero no sé si realmente es así). Para que en mi tablet vayan del 1 al 5000 y en la otra del 5000 al 10000 (no va a tener muchos más registros en los próximos ¿10 años? y dudo que siga en sqlite jeje). Gracias de nuevo! |
#14
|
||||
|
||||
Depende... yo suelo dejar un ID autoincrement, que mejor es no tocar. Y luego le pones otro campo similar, que no sería necesariamente autoincrement. Pero en cada tablet, ayudandote de un archivo de configuracion, sencillamente puedes determinar que ID quieres poner a ese registro. Incluso podria ser alfanumerico. A00001 para una tablet y B00001 para la otra. Pero todo eso aparte del propio ID. Sería lo más cómodo.
__________________
Por respeto a los demas:
Y, en general, trata a todo el mundo como te gusta a ti que te traten. |
#15
|
||||
|
||||
OK, gracias!
|
#16
|
||||
|
||||
Una cosita tonta, el galaxy tab usa sqlite 3.7.4. Mi servidor no soporta sqlite3 (llevo un rato volviéndome loco, porque en phpinfo pone que sí).
¿Puedo usar una base de datos de una versión anterior a sqlite3 en la aplicación, o tiene que ser sqlite3 por narices? |
![]() |
![]() |
||||||
|