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

Respuesta
 
Herramientas
  #1  
Viejo 19/11/11, 17:29:47
Array

[xs_avatar]
astrolozan astrolozan no está en línea
Miembro del foro
 
Fecha de registro: jun 2011
Mensajes: 396
Modelo de smartphone: Samsung GT-I9300 (galaxy SIII)
Tu operador: Orange
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!!!
Responder Con Cita


  #2  
Viejo 20/11/11, 18:05:04
Array

[xs_avatar]
future21 future21 no está en línea
Miembro del foro
 
Fecha de registro: oct 2010
Mensajes: 144
Tu operador: Movistar

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
Responder Con Cita
  #3  
Viejo 20/11/11, 21:15:08
Array

[xs_avatar]
iliberis iliberis no está en línea
Miembro del foro
 
Fecha de registro: abr 2009
Localización: Graná, España
Mensajes: 439
Modelo de smartphone: HTC Trinity, Samsung Galaxy Mini, ZTE Blade, ZTE Light Pro
Tu operador: Simyo
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:
  • Preséntate. Esto es un foro, no un centro de soporte
  • Escribe correctamente, para que podamos entendernos todos. Esto NO es un SMS, sino un foro.
  • Usa el buscador. No muerde. Evitemos tener cien hilos con la misma pregunta.
  • Insisto: Usa el buscador Usa el buscador Usa el buscador Usa el buscador
  • No escribas en mayúsculas. Es de mala educación.

Y, en general, trata a todo el mundo como te gusta a ti que te traten.
Responder Con Cita
  #4  
Viejo 21/11/11, 00:35:03
Array

[xs_avatar]
astrolozan astrolozan no está en línea
Miembro del foro
 
Fecha de registro: jun 2011
Mensajes: 396
Modelo de smartphone: Samsung GT-I9300 (galaxy SIII)
Tu operador: Orange
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.
Responder Con Cita
  #5  
Viejo 21/11/11, 00:51:02
Array

[xs_avatar]
iliberis iliberis no está en línea
Miembro del foro
 
Fecha de registro: abr 2009
Localización: Graná, España
Mensajes: 439
Modelo de smartphone: HTC Trinity, Samsung Galaxy Mini, ZTE Blade, ZTE Light Pro
Tu operador: Simyo
 Cita: Originalmente Escrito por astrolozan Ver Mensaje
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).
Ambas cosas son la misma. Solo cambia la aproximación. O sincronizas cada vez que haya cambios (que, por lo visto, no va a ser posible por eso de la cobertura), o simplemente de vez en cuando... vamos, cada 6 horas o así.

 Cita: Originalmente Escrito por astrolozan Ver Mensaje
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.
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.

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:
  • Preséntate. Esto es un foro, no un centro de soporte
  • Escribe correctamente, para que podamos entendernos todos. Esto NO es un SMS, sino un foro.
  • Usa el buscador. No muerde. Evitemos tener cien hilos con la misma pregunta.
  • Insisto: Usa el buscador Usa el buscador Usa el buscador Usa el buscador
  • No escribas en mayúsculas. Es de mala educación.

Y, en general, trata a todo el mundo como te gusta a ti que te traten.
Responder Con Cita
  #6  
Viejo 21/11/11, 01:03:16
Array

[xs_avatar]
astrolozan astrolozan no está en línea
Miembro del foro
 
Fecha de registro: jun 2011
Mensajes: 396
Modelo de smartphone: Samsung GT-I9300 (galaxy SIII)
Tu operador: Orange
 Cita: Originalmente Escrito por iliberis Ver Mensaje
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.
Gracias de nuevo.
¿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!!
Responder Con Cita
  #7  
Viejo 21/11/11, 01:07:22
Array

[xs_avatar]
astrolozan astrolozan no está en línea
Miembro del foro
 
Fecha de registro: jun 2011
Mensajes: 396
Modelo de smartphone: Samsung GT-I9300 (galaxy SIII)
Tu operador: Orange
 Cita: Originalmente Escrito por iliberis Ver Mensaje
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.
¿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...
Responder Con Cita
  #8  
Viejo 21/11/11, 10:36:32
Array

[xs_avatar]
future21 future21 no está en línea
Miembro del foro
 
Fecha de registro: oct 2010
Mensajes: 144
Tu operador: Movistar

 Cita: Originalmente Escrito por astrolozan Ver Mensaje
¿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...
Vamos a ver. Aqui hay una serie de cuestiones que hay que sopesar. Si imaginamos que tu actualizas un campo texto en tu tablet y tu compañero modifica el mismo campo texto del mismo registro en su tablet, ¿cual seria el valido?. Si el valido es el ultimo modificado, por cada registro de la BD añades un campo fecha/hora. A la hora de sincronizar, en la sentencia SQL modificas la BD online solamente si el campo fecha/hora de cada registro en la tablet (tabla temporal) es mayor que el campo fecha /hora de la BD online. ¿Que quieres mantener los dos cambios? Eso es harina de otro costal. Crearia dos usuarios en la BD online y en las temporales, y simplemente subiria todo pero cada usuario modificaria sus registros propios. Para ello podria poner un campo usuario en la BD online y temporales y rellenarlas con los registros de las temporales de cada usuario. Te comente al principio en mi primer post que el tema bloqueos es super importante en la gestion de una actualizacion. Si quieres mantener una sola base de datos puedes o añadir un campo fecha/hora en las temporales y en la online o en un fichero de log que escriba el registro modificado y la fecha hora y comparar en la actualizacion ese campo con la fecha/hora de la actualizacion del registro de la BD online. Es realmente un lio, lo suyo es estar online y bloquear sobre la marcha para escribir en la BD y que tu compañero vea los cambios al instante y modifique sobre tus cambios. Viendo que esto no es posible, o haces una comparacion de fecha/hora para cada registro desde las BD temporales hacia la online, y cuando la online este actualizada, la copias en la temporal y la bajas a tu tablet, o si quieres mantener todo (lo cual, no lo veo), duplicas registros añadiendo como indice el usuario, que seriais en tu caso dos usuarios o dos tablets. Por otro lado, el tema Fusion Tablets es una base de datos de Google gratuita que puedes utilizar en el caso de no tener un servidor propio y necesitar uno gratuito y online continuamente (https://www.google.com/fusiontables/Home)

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.
Responder Con Cita
  #9  
Viejo 21/11/11, 12:20:40
Array

[xs_avatar]
iliberis iliberis no está en línea
Miembro del foro
 
Fecha de registro: abr 2009
Localización: Graná, España
Mensajes: 439
Modelo de smartphone: HTC Trinity, Samsung Galaxy Mini, ZTE Blade, ZTE Light Pro
Tu operador: Simyo
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:
  • Preséntate. Esto es un foro, no un centro de soporte
  • Escribe correctamente, para que podamos entendernos todos. Esto NO es un SMS, sino un foro.
  • Usa el buscador. No muerde. Evitemos tener cien hilos con la misma pregunta.
  • Insisto: Usa el buscador Usa el buscador Usa el buscador Usa el buscador
  • No escribas en mayúsculas. Es de mala educación.

Y, en general, trata a todo el mundo como te gusta a ti que te traten.
Responder Con Cita
  #10  
Viejo 21/11/11, 12:50:53
Array

[xs_avatar]
astrolozan astrolozan no está en línea
Miembro del foro
 
Fecha de registro: jun 2011
Mensajes: 396
Modelo de smartphone: Samsung GT-I9300 (galaxy SIII)
Tu operador: Orange
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!!
Responder Con Cita
  #11  
Viejo 21/11/11, 12:54:17
Array

[xs_avatar]
future21 future21 no está en línea
Miembro del foro
 
Fecha de registro: oct 2010
Mensajes: 144
Tu operador: Movistar

 Cita: Originalmente Escrito por iliberis Ver Mensaje
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.
Exactamente, eso es un control, si en el caso de que por fecha no sea valido el mas antiguo, antes de modificar pregunta al usuario si quiere modificar la BD aun cuando la fecha de modificacion sea anterior en la BD temporal que en la online. Muestra el registro de la online antes y que campo se modificará. Lo que haces es hacer manual lo que antes se haria automaticamente si estuviera online la BD. Yo sinceramente, si son pocos registros y quizas el tema no tiene gran importancia lo haria asi, pero si son muchos registros y el trabajo es crucial y serio, buscaria otras alternativas (quizas conexion a internet por satelite?), y siempre y cuando el presupuesto lo permita. Es mi humilde opinion y ya digo que si el trabajo fuera por ejemplo para una empresa y no algo particular

Saludos.
Responder Con Cita
  #12  
Viejo 21/11/11, 13:03:35
Array

[xs_avatar]
future21 future21 no está en línea
Miembro del foro
 
Fecha de registro: oct 2010
Mensajes: 144
Tu operador: Movistar

 Cita: Originalmente Escrito por astrolozan Ver Mensaje
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!!
Yo primero actualizaria la online pasando tus controles. Luego me copiaria la online entera en tu tablet sobreescribiendo tu BD temporal con una copia de la online. Puedes hacer una copia de tu temporal antes por si acaso. En fin, controles puedes hacer cientos. Teniendo una copia cada uno de su temporal siempre podreis ir hacia atras en caso de error.

Saludos.
Responder Con Cita
  #13  
Viejo 21/11/11, 13:10:01
Array

[xs_avatar]
astrolozan astrolozan no está en línea
Miembro del foro
 
Fecha de registro: jun 2011
Mensajes: 396
Modelo de smartphone: Samsung GT-I9300 (galaxy SIII)
Tu operador: Orange
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!
Responder Con Cita
  #14  
Viejo 21/11/11, 13:14:20
Array

[xs_avatar]
iliberis iliberis no está en línea
Miembro del foro
 
Fecha de registro: abr 2009
Localización: Graná, España
Mensajes: 439
Modelo de smartphone: HTC Trinity, Samsung Galaxy Mini, ZTE Blade, ZTE Light Pro
Tu operador: Simyo
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:
  • Preséntate. Esto es un foro, no un centro de soporte
  • Escribe correctamente, para que podamos entendernos todos. Esto NO es un SMS, sino un foro.
  • Usa el buscador. No muerde. Evitemos tener cien hilos con la misma pregunta.
  • Insisto: Usa el buscador Usa el buscador Usa el buscador Usa el buscador
  • No escribas en mayúsculas. Es de mala educación.

Y, en general, trata a todo el mundo como te gusta a ti que te traten.
Responder Con Cita
  #15  
Viejo 21/11/11, 13:15:21
Array

[xs_avatar]
astrolozan astrolozan no está en línea
Miembro del foro
 
Fecha de registro: jun 2011
Mensajes: 396
Modelo de smartphone: Samsung GT-I9300 (galaxy SIII)
Tu operador: Orange
OK, gracias!
Responder Con Cita
  #16  
Viejo 21/11/11, 18:50:58
Array

[xs_avatar]
astrolozan astrolozan no está en línea
Miembro del foro
 
Fecha de registro: jun 2011
Mensajes: 396
Modelo de smartphone: Samsung GT-I9300 (galaxy SIII)
Tu operador: Orange
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?
Responder Con Cita
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 21:54:15 (GMT +2)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /