Almacenar datos en PhoneGap/Cordova: otras alternativas

Últimamente he estado comparando distintas formas de almacenar datos de forma local con PhoneGap/Cordova y hemos visto las dos opciones que se explican en la documentación sobre almacenamiento de Cordova: la forma más sencilla usando localStorage y la más potente con Web SQL.

No quiero cerrar el tema sin antes mencionar otras alternativas menos «ortodoxas» que también se me han pasado por la cabeza.

Utilizar el sistema de archivos

Con Cordova podemos acceder al sistema de archivos del dispositivo móvil utilizando un API basada en el File API del W3C. De esta forma, podemos guardar la información serializándola en archivos de texto.

El API para acceder al sistema de archivos no es especialmente bonito:

// Escribir un archivo de texto
window.requestFileSystem(window.LocalFileSystem.PERSISTENT, 0,
    function (fileSystem) {
        fileSystem.root.getFile('test.txt', {create: true}, 
            function (fileEntry) {
                fileEntry.createWriter(function (writer) {
                writer.write('this is only a test');
            });
        },
        onError);
    },
    onError);

// Leer un archivo de tetxo
window.requestFileSystem(window.LocalFileSystem.PERSISTENT, 0,
    function (fileSystem) {
        fileSystem.root.getFile('test.txt', {create: false}, 
            function (fileEntry) {
                var reader = new FileReader();
                reader.onloadend = function(evt) {
                    alert(evt.target.result);
                };
                reader.readAsText(fileEntry);
            },
            onError);
        },
        onError);

Como veis, un montón de callbacks anidadas y algunas inconsistencias, como que para crear un FileWriter se use el factory method fileEntry.createWriter() mientras que para crear un FileReader se use el constructor sin parámetros new FileReader() y luego se le pase el fileEntry en el método reader.readAsText(fileEntry).

Por lo demás, la ventaja que tiene este sistema es que la información está almacenada de forma independiente de la aplicación y puede ser fácilmente compartida con otras aplicaciones. A cambio, la implementación de Cordova en la versión 2.1 no soporta el evento onprogress, lo que obliga a leer el fichero completo en memoria de una sola vez, por lo que podemos tener problemas si necesitamos almacenar mucha información.

Crear un plugin

Aprovechando el sistema de plugins de Cordova, podemos utilizar cualquier sistema de almacenamiento que proporcione la plataforma sobre la que se ejecuta la aplicación.

Esta opción es muy flexible y permite conseguir un buen rendimiento ya que permite trabajar a muy bajo nivel con cada plataforma y ajustar perfectamente el sistema de almacenamiento a las necesidades concretas de la aplicación.

El mayor inconveniente de esta opción es que requiere mucho trabajo y obliga a desarrollar la parte nativa del plugin para todas las plataformas que vayamos a soportar con nuestra aplicación, por lo que se pierden parte de las ventajas de utilizar Cordova.

Recurrir a librerías de terceros

No hay que olvidar que al final la aplicación se está ejecutando sobre un navegador, por lo que podemos recurrir a cualquier alternativa que esté soportada por el navegador de cada plataforma, como por ejemplo IndexedDB en algunos navegadores.

Además, existen librerías en Javascript que ayudan a manejar datos persistentes de forma más o menos independiente de la plataforma, como por ejemplo JayData o DB.JS.

Una ventaja de utilizar Cordova es que si una de las APIs no está soportada de forma nativa en una plataforma, Cordova trata de simularla. Sin embargo, al salirnos del colchón que ofrece Cordova, tendremos que asegurarnos que las librerías y funcionalidades utilizadas están disponibles en las plataformas para las que estamos desarrollando.

Conclusiones

En estos posts hemos visto unas cuantas formas de guardar información de forma local en una aplicación desarrollada con PhoneGap/Cordova. Cada una de ellas tiene puntos a favor y puntos en contra, por lo que es importante detenerse un rato a pensar qué necesidades tenemos antes de decantarnos por una u otra.

Probablemente, en la mayoría de aplicaciones bastará con el almacenamiento ofrecido por LocalStorage, pero si la aplicación tiene que trabajar mucho tiempo desconectada con un volumen de datos más o menos grande, seguramente merezca la pena utilizar Web SQL.

3 comentarios en “Almacenar datos en PhoneGap/Cordova: otras alternativas

  1. hola que tal! me sirviomucho tu post y tengo una duda relacionada.
    como crear una carpeta?
    he probadocon el codigo de la documentacion pero no lo consigo, lo que quiero hacer es que al iniciar la aplicacion busque la carpeta y si no existecrearla, para trabajar con los archivos que generara la aplicacion

    saludos

  2. Eloy Fernández dijo:

    Hola buenos días.
    Tengo una duda… en el primer método, utilizar el sistema de archivos… ¿dónde guarda el archivo?
    GRACIAS

Comentarios cerrados.