Actualizando una base de datos local desde un servidor remoto - Parte III (final)
- app.js que es la aplicación de pruebas del mecanismo de actualización
- updatedb.js que es una biblioteca o librería que contiene el mecanismo de actualización
- Una estructura de datos de configuración que especifica datos como la url del servidor Web donde se va a alojar la base de datos, el nombre de la base de datos, el nombre del archivo de configuración, etc.
- Una función updatedb que permite la actualización de la base de datos local a partir de la base de datos remota y un conjunto de funciones auxiliares (helper functions)
Dato
|
Descripción
|
url
|
URL del servidor Web donde hemos
alojado la base de datos
|
db
|
Nombre de la base de datos
|
cf
|
Nombre del archivo de
configuración que contiene una fecha en formato YYYYMMDD (ejemplo
20130226)
|
timeout
|
Tiempo de respuesta para el
servidor Web que hemos fijado en unos 10,000 milisegundos o 10
segundos por defecto
|
android
|
True indica que vamos a ejecutar
la aplicación en un smartphone Android, False indica que vamos a
ejecutarla en un smartphone de Apple
|
debug
|
En True indica si queremos
visualizar mensajes que nos ayuden a la puesta a punto. Una vez
lista para desplegar en Producción este campo debería ser False
|
debugcb
|
Debug Callback. Llama a esta
función cuando se produce una situación de depuración
|
updatecb
|
Update Callback. Llama a esta
función cuando termina la actualización de la base de datos
|
errorcb
|
Error Callback. Llama a esta
función cuando se produce un error catastrófico durante la
actualización
|
winx
|
Ventana principal de la aplicación
|
olddate
|
Fecha de la configuración local o
última actualización que registramos
|
newdate
|
Fecha de la configuración remota
|
myapp.dbu.actind =
Titanium.UI.createActivityIndicator({ height:25, width:25 });
// If the application is running in iOS
if (!myapp.dbu.android){
// Setting the activity indicator style
myapp.dbu.actind.style =
Titanium.UI.iPhone.ActivityIndicatorStyle.BIG; // Adding the indicator to the main window myapp.dbu.winx.add(myapp.dbu.actind); }
if (Titanium.Network.networkType !==
Titanium.Network.NETWORK_NONE){
// Get the remote config file with the date to update
myapp.dbu.getremoteconfig();
}
var fcf = Ti.Filesystem.getFile(
Ti.Filesystem.applicationDataDirectory,myapp.dbu.cf);
// if there is not a configuration file
// in the application directory if (!fcf.exists()){ // It's the first time we need to update
// the database and no network connection var alertDialog = Titanium.UI.createAlertDialog({ title: 'WARNING!', message: 'You need an internet connection'+
'to update your application data!', buttonNames: ['OK'] }); // Show alert dialog alertDialog.show(); // Close application because
// there is not information or data to process
myapp.dbu.winx.close();
}
Si no hay conexión a Internet busca si hay un archivo de configuración local en nuestro smartphone. Si no existe, es la primera vez que se realiza la actualización por lo que terminamos con un mensaje de error ya que no es posible actualizar nuestra aplicación.
if (myapp.dbu.updatecb != null) { myapp.dbu.updatecb(); }
// Background color Titanium.UI.setBackgroundColor('#000'); // Global namespace var myapp = {}; // Application main windows var win1 = Titanium.UI.createWindow({ title:'DemoDB', backgroundColor:'#fff', exitOnClose: true });
// Function to list database content var showdatabase = function() { // Open database var db = Ti.Database.open('bestres.sqlite3'); // Execute a query to get a recordset var restaurants =
db.execute('select name,area,style from restaurants'); var s = ""; // while there are records in the recordset while (restaurants.isValidRow()){ // Get the fields content s += "NAME= " + restaurants.fieldByName("name") + ",AREA= " + restaurants.fieldByName("area") + ",STYLE= " + restaurants.fieldByName("style") + ";"; // Navigate to the next record restaurants.next(); } // Close the recordset restaurants.close(); // Show the records content alert("DATABASE CONTENT => " + s); }
// Including library Ti.include('updatedb.js'); // Configuring database access myapp.dbu.url = 'http://ayalawilson.com/apps/demodb/'; myapp.dbu.db = 'bestres.sqlite3'; myapp.dbu.cf = 'bestrescf'; myapp.dbu.debug = true; myapp.dbu.updatecb = showdatabase; myapp.dbu.winx = win1; // Updating database myapp.dbu.updatedb(); // On resume event show database Ti.App.addEventListener('resume', function() { showdatabase(); }); // Open the application main window win1.open();
- La url de la carpeta en el servidor Web donde se encuentra la base de datos
- El nombre de la base de datos
- El nombre del archivo de configuración que contiene la fecha de actualización
- Ponemos a debug en true para ver mensajes de depuración
- Indicamos que el updatecb (Update Callback) será la función showdatabase() que hemos creado previamente
- Indicamos que la ventana de la aplicación será win1
- Añadimos al evento ‘resume’ (cuando pase de estar minimizada a tener el foco de ejecución) ejecute la función showdatabase() para mostrarnos los datos
- Abrimos la ventana principal de la aplicación para comenzar su ejecución
- Sustituimos el archivo de la base de datos remota
- Actualizamos el archivo de configuración con la fecha actual
Si no hay conexión a Internet en el momento que arranca la aplicación pueden ocurrir dos cosas:
- Que exista la base de datos local (descargada en otro momento). En ese caso, la aplicación utiliza los datos locales ya descargados
- Que no exista la base de datos local (la aplicación nunca se ha iniciado). En esta caso nos presenta un mensaje de error y termina
- Apple iPhone 4S
- Samsung Galaxy SII con Android "Jelly Bean" 4.03
- Aplicaciones que necesitan operar con bases de datos en modo desconectado (offline), lo que permite que un usuario puede consultar la información deseada viajando por el metro o en el campo o en la carretera o en zonas de difícil o ninguna cobertura
- Bases de datos relativamente de pequeño tamaño para no consumir mucho ancho de banda con las descargas
- Bases de datos de solo lectura donde los usuarios solo consumen información, pero no aportan nada (ni comentarios, ni ratings, etc.)
- Actualizaciones poco frecuentes (los mejores restaurantes de una ciudad no cambian todas las semanas)
- La base de datos, al ser el núcleo de la información y no estar embebida en una carpeta de recursos de nuestra aplicación, permite que esta pueda actualizarse si tener que actualizar la aplicación completa



















Recent Comments