Professional Documents
Culture Documents
El beneficio de utilizar almacenamiento local es que permite manejar datos offline en nuestras aplicaciones y mejorar el rendimiento. En trminos generales, se tienen las siguientes caractersticas: Sandbox: Todo lo que corre sobre el navegador se ejecuta sobre Sandbox, es decir, est en una caja cerrada donde no se pueden tocar elementos exteriores para no afectar otros elementos del equipo del usuario; en otras palabras, solamente la pgina que guarda un dato, puede acceder a l y utilizarlo. Ninguna otra pgina tendr acceso al dato. Cuota: La cuota del espacio es limitada y la define cada navegador. Transacciones: Existen 2 tipos de bases de datos que permiten transacciones para mantener la integridad de los datos. Recuerda que una transaccin tiene 2 situaciones: rollback (en caso de error) y commit (confirmando la operacin en caso de xito) bajo la premisa de atomicidad: Se ejecuta TODO o NADA. Sncrono y Asncrono: Los tipos de almacenamiento tienen mtodos sncronos y asncronos.
Para detectar si un navegador tiene conexin a Internet, se puede utilizar la propiedad online del objeto navigator:
var condition = navigator.onLine ? "online" : "offline";
Las siguientes son las desventajas de esta forma de almacenamiento con HTML 5: No se soporta en IE ni en Firefox Requiere conocer la sintaxis de SQL Es un estndar que no se va a continuar. Los 3 mtodos que maneja WebSQL son: openDatabase transaction executeSql
Para crear una base de datos se utiliza el mtodo openDatabase: var db = openDatabase('base', '1.0', 'Mi BD', 2*1024*1024);
Este mtodo sirve tanto para crear una base de datos como para abrir una conexin a sta. Si ya existiera, se usara la base de datos existente, en caso contrario, se creara una nueva. Los parmetros son: Nombre de base de datos Versin Descripcin de la base de datos Tamao en bytes.
El mtodo openDatabase tambin permite conocer si el navegador soporta o no Web Storage: if(!window.openDatabase) alert("Tu navegador no acepta WebSQL");
if (db) { db.transaction(function (tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS USUARIOS (id unique, nombre, apellido)'); tx.executeSql('INSERT INTO USUARIOS VALUES (1, "Juan", "Perez")'); tx.executeSql('INSERT INTO USUARIOS VALUES (2, "Pepe", "Lopez")'); }); }
La ejecucin de la transaccin nos retornar un punto de ejecucin sobre esta transaccin, por lo tanto, todas las ejecuciones sobre la misma se harn dentro de este contexto. Es importante aclarar que el elemento transaction() puede contener un segundo parmetro para manejar la excepcin generada por la ejecucin de la transaccin.
db.transaction(function (tx) tx.executeSql('CREATE nombre, apellido)'); tx.executeSql('INSERT tx.executeSql('INSERT }, function (err) { alert(err); });
{ TABLE IF NOT EXISTS USUARIOS (id unique, INTO USUARIOS VALUES (1, "Juan", "Perez")'); INTO USUARIOS VALUES (2, "Pepe", "Lopez")');
Si se ejecuta por segunda vez el cdigo, el valor de la columna ID no resulta nico, por lo tanto la transaccin es cancelada y la funcin del error es lanzada. Sobre este motor es posible realizar consultas de la misma forma que el estndar SQL, pero tambin sobre una transaccin con el mtodo executeSql:
db.transaction(function (tx) { tx.executeSql('SELECT * FROM USUARIOS', [], function (tx, results) { var len = results.rows.length, i;
Ejercicio: Realice una pgina donde se almacene una lista de tareas por hacer de forma local, con la funcionalidad de Agregar y Eliminar. Hoja de estilos estilos.css .terminado, .Terminado{ color: #ccc; text-decoration: line-through; } .item:hover, .Falta:hover{ cursor: pointer; } Pgina html: <!doctype html> <html> <head> <script type="text/javascript" src="websql.js"></script> <link rel="stylesheet" href="estilos.css"> </head> <body> <h2>Lista de Tareas</h2> <input id="txtTarea" type="text" placeholder="Por realizar..."/> <button id="btnAgregar">Agregar</button> <button id="btnEliminar">Eliminar</button> <ul id="lista"></ul> </body>
Es la alternativa al WebSQL, que est obsoleto. Aunque cabe recordar que WebSQL es utilizado ampliamente por los navegadores mviles. Dentro de sus desventajas nos encontramos con las siguientes: Su API es un poco ms complicada. Se debe garantizar la integridad de los datos debido a que es un almacn de objetos, no se manejan tablas de datos.
Como primer paso para utilizar IndexedDB, necesitas verificar que el navegador soporta esta caracterstica de HTML 5. En caso afirmativo, asignar 2 propiedades del objeto window: IDBTransaction e IDBKeyRange. Observa que estos 3 elementos del objeto window son particulares de cada navegador, por lo que hay que revisar cul es el que se necesita al ejecutar la pgina: window.indexedDB = window.indexedDB || window.mozIndexedDB window.webkitIndexedDB || window.msIndexedDB; if (!window.indexedDB) { alert("Tu navegador no soporta IndexedDB"); return; } window.IDBTransaction = window.IDBTransaction window.webkitIDBTransaction || window.msIDBTransaction; window.IDBKeyRange = window.IDBKeyRange window.webkitIDBKeyRange || window.msIDBKeyRange; || || ||
El segundo paso es asignar una referencia a la base de datos y agregar eventos. Se puede lograr con el siguiente cdigo: var dbManager = {}; dbManager.db = {};
Ejercicio: A partir del ejercicio anterior, implemente la misma funcionalidad utilizando IndexedDB en lugar de WebSQL: Script IndexDB.js: window.onload = function(){ window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction; window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange; if (!window.indexedDB) { alert("Tu navegador no soporta IndexedDB"); return; } var btnAgregar = document.getElementById("btnAgregar"); var btnEliminar = document.getElementById("btnEliminar"); var tarea = document.getElementById("txtTarea"); btnAgregar.addEventListener("click", function(){ dbManager.insertarTarea(tarea.value); });
var dibujarTareas = function(){ dbManager.crearDB(function(){ dbManager.getTodasTareas(function(tareas){ tareas.forEach(function(tarea){ agregarElemento(tarea.tarea, tarea.estado); }); }); }); }; var agregarElemento = function (itemTarea, clase){ var lista = document.getElementById("lista"); var nuevo = document.createElement("li"); nuevo.setAttribute("class",(!clase)?"Falta":clase); nuevo.innerText = itemTarea; lista.appendChild(nuevo); nuevo.addEventListener("click", function(){ dbManager.finalizarTarea(nuevo); }); var tarea = document.getElementById("txtTarea"); tarea.value = ""; };
Y las desventajas son: Su desarrollo es reciente, por lo que solamente se soporta en Chrome No maneja transacciones No soporta el indexamiento para las bsquedas
Para implementar FileAccess, en primer lugar genera el objeto requestFileSystem, el cual maneja objetos particulares para cada navegador (actualmente solo se soporta Google Chrome): window.requestFileSystem window.webkitRequestFileSystem; = window.requestFileSystem 5 * 1024 * || 1024,
La peticin puede ser temporal (TEMPORARY) o permanente (PERMANENT). Si es temporal, la informacin almacenada puede ser removida por el navegador, mientras que si es permanente, solamente el usuario de forma explcita o la misma pgina web puede eliminar el contenido. Al hacer la peticin del requestFileSystem se indican 2 mtodos para el caso de xito y error. Los mtodos se deben implementar con la codificacin deseada: var onSuccess = function(filesystem){ console.log("Sistema de Archivos accesado.") fs = filesystem; }; var onError = function(e) { var msg = ''; switch (e.code) { case FileError.QUOTA_EXCEEDED_ERR: msg = 'Cuota excedida'; break; case FileError.NOT_FOUND_ERR: