Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Desarrollo en Delphi para Android
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-04-2016
EdgarSamudio EdgarSamudio is offline
Registrado
NULL
 
Registrado: sep 2014
Posts: 3
Poder: 0
EdgarSamudio Va por buen camino
Question Actualizar BD Sqlite Android

Muy buenos días a todos.

Tengo un pequeño proyecto hecho en Firemonkey (Delphi 10Seattle), la cual usa una BD Sqlite que obtiene los datos iniciales de un Servidor DataSnap en un equipo Windows Server 2008 x64 con Firebird-2.5.5.26952_0 también x64, un servidor FTP con una IP pública y sus respectivos puertos en escucha.

Otras herramientas que uso son:
1- KataKuntur v2.5.2, data modeler para SQLite, Jean Mazuelos
2- SQLite Administrator v0.8.3.2, Orbmuk2

La funcionalidad es así, al instalar la aplicación el usuario manualmente tiene que ejecutar una utilidad que consulta e inserta del servidor DataSnap a SQLite todos los registros de las tablas a usar, (Clientes, Productos) y funcione localmente desde entonces, sin consultar o enviar datos al servidor DataSnap (esto es a causa de la muy mala conexión a internet de las operadoras móviles en mi ciudad/país).

Básicamente la app obtiene los datos iniciales, luego los usuarios hacen inserciones, consultas y/o modificaciones en las tablas, todos en la BD del dispositivo; hasta acá todo bien y no hay inconvenientes.

Cada dispositivo tiene datos nuevos cargados en SQLite (fichar nuevo cliente, cargar pedidos de ventas) que al término de la jornada o recorrido, los usuarios envían manualmente al servidor DataSnap los datos pendientes y obtienen los registros iniciales de nuevo para el próximo día siempre usando esa utilidad de la aplicación.

El problema está en cómo actualizar la BD Sqlite del dispositivo cuando haya cambios del diseño de la BD, como por ejemplo uno o varios campos nuevos, o una tabla nueva sin desinstalar la aplicación y/o perder datos.

Los cambios lo hago usando KK y exporto el diagrama la cuál genera la BD.sqlite, este añado al proyecto Firemonkey y al construir adjunta al APK.

El nuevo APK es alojada al servidor FTP para su descarga, los usuarios lo obtienen e instalan en sus dispositivos pero no actualiza la BD antigua.

Buscando en internet encontre estos foros que por cierto están en portugués

1: Fórum Programador Mobile - Android - IOS - Delphi
programadormobile.com.br/viewtopic.php?f=24&t=383&p=1317

2: [ANDROID/IOS]Atualizar DB sqlite pelo aplicativo
programadormobile.com.br/novo/2015/05/26/androidiosatualizar-db-sqlite-pelo-aplicativo/

Ambos foros describen una idéntica lógica/solución la cuál es crear un procedure en delphi para así validar por cada campo algún cambio de estructura, pero no prevé los datos.

Además, el mismo autor admite que podría haber otra solución más eficiente y es por eso que me atreví a escribir al foro y robarles su preciado tiempo a todos ya que soy muy novato en todo esto (Delphi y SQLite).

La idea es hacer una utilidad como DBComparer para SQLite que funcione en Android e iOS dentro de la misma aplicación o cómo una utilidad externa a ella, de ahí a que herramientas usar y cómo hacerlo es mi gran duda.

Agradezco de antemano y que tengan buen resto de jornada.
Responder Con Cita
  #2  
Antiguo 25-04-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Hay diversas formas, todo depende de lo que realmente te venga mejor. Independientemente de la base de datos que uses, sistema operativo y lenguaje de programación.
Es un tema que se ha tratado en diversas ocasiones, a ver si podemos encontrarlo.
Aunque básicamente es añadir las sentencias que necesites a un script o como registros en una tabla.
En tu software tienes una opción para detectar si hay nuevas sentencias a ejecutar, las procesas y marcas cuál es la útima ejecutada.
Esto último puedes hacerlo de mucha formas también, ya sea un fichero con la última sentencia ejecutada, o una tabla donde guardas las que se ejecutan:
create tbActualizaciones (id integer primary key, sentencia varchar(2000)... etc.) según necesites.
Al iniciar tu software compruebas la última sentencia ejecutada (el id de esa tabla) y miras si hay nuevas sentencias a ejecutar en un script, por ejemplo, o en una base de datos auxiliar, etc...
En fin, es un tema muy amplio que permite una variedad bastante amplia, a cada uno le viene mejor una forma u otra.
Responder Con Cita
  #3  
Antiguo 26-04-2016
EdgarSamudio EdgarSamudio is offline
Registrado
NULL
 
Registrado: sep 2014
Posts: 3
Poder: 0
EdgarSamudio Va por buen camino
Muy buenos días de nuevo.
Hola Casimiro, voy a hacer cómo dices y les comento que tal me fue.

Gracias por tu tiempo y un abrazo.
Responder Con Cita
  #4  
Antiguo 25-06-2016
EdgarSamudio EdgarSamudio is offline
Registrado
NULL
 
Registrado: sep 2014
Posts: 3
Poder: 0
EdgarSamudio Va por buen camino
Muy buenos dias a todos.
Primeramente pido disculpas por tardar tanto...

Quiero compartir con uds. como pude solucionar mi problema descrito.

Casimiro, efectivamente funciona tu sugerencia... aunque me topé con varios obstáculos, uno de ellos fue que no se puede ELIMINAR, MODIFICAR la estructura de un campo

o renombrar una tabla en SQLite (si estoy equivocado, favor corregir).

Bueno, lo que hice fue lo siguiente:

1- Cree otra BD (MASTER) con una tabla BD_CAMBIOS, en la cuál estan cargados los scripts y/o datos de actualizacion para la BD instalada en el dispositivo (TARGET).
2- Cree un tabla BD_CAMBIOS en la BD TARGET también, en la cual se guardarán como logs los cambios hechos (ultimo_id).
2- Al inicializar la app, elimino la BD MASTER del dispositivo si existe y extraigo el nuevo desde el APK, conecto a dicha BD.
3- Hago un select de la tabla BD_CAMBIOS y tiene como condicional el ultimo_id del TARGET, si tiene registros entra en un bucle y con un QueryAux ejecuto los scripts.

Les agradezco mucho por su tiempo y un abrazo.
Responder Con Cita
  #5  
Antiguo 25-06-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
En tu caso también puedes crear una tabla nueva con los campos y cambios que necesites. Pasas los datos de la tabla vieja a la nueva. Finalmente borras la tabla vieja y renombras la nueva con el nombre de la vieja.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
SQLite is Locked? Problema con SQLite. pokexperto1 Conexión con bases de datos 6 05-06-2016 23:24:08
Wifi, Android y SQLite Jose Roman Varios 3 10-09-2015 15:36:30
SQLite y Max(ID) FGarcia Tablas planas 1 24-04-2014 18:44:27
Android SQLite pantalla negra Davidecr Desarrollo en Delphi para Android 9 17-03-2014 19:41:09
SQLite mblascog Conexión con bases de datos 2 19-02-2011 20:51:00


La franja horaria es GMT +2. Ahora son las 17:45:01.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi