2011-10-02 21 views
9

Necesito construir una aplicación web HTML5 fuera de línea para un iPad/dispositivo de tableta donde el usuario puede descargar un conjunto de datos (tabla de datos) del servidor y almacenarlo en el dispositivo. El usuario podría desconectarse del servidor y ver/editar los datos localmente en el dispositivo. Esto es para personas que trabajan en áreas remotas donde no hay cobertura celular y necesitan recopilar/actualizar datos. Cuando vuelven a la oficina, pueden sincronizar/cargar los datos nuevamente al servidor. La razón por la que debe ser HTML5 es que es independiente de la plataforma, es decir, puede ejecutarse en iOS, Android, etc. siempre que tenga un navegador web moderno que admita HTML5.Wrapper functions for IndexedDB

Ahora ya he creado el sistema utilizando el almacenamiento local HTML5 (para los datos) y el caché de aplicaciones sin conexión HTML5 (para las páginas/css/js/images) y funciona bastante bien con pequeños conjuntos de datos (puedo ver , edite y guarde sin conexión y cargue/sincronice mientras está en línea). Ahora necesito escalar hasta 10,000 filas de datos. Funciona, pero es bastante lento y bloquea el navegador durante 10 segundos mientras se carga en una máquina Intel quad core de 8GB.

Así que he estado investigando unos mejores alternativas que el almacenamiento local:

1) WebSQL: sería capaz de consultar los datos utilizando el lenguaje SQL y hacer une etc. El problema es que ahora está en desuso una no lo hará ser apoyado por más tiempo, así que no quiero invertir tiempo construyendo algo para ello.

2) IndexedDB: Utiliza un almacén de objetos (que técnicamente ya estoy almacenando objetos usando la API de almacenamiento local y almacenando usando JSON). Potencialmente es más rápido ya que usa índices con el servidor SQL lite. Hay muchos códigos repetitivos para realizar tareas sencillas, como crear la base de datos, agregarla, leerla, iterar sobre ella. Solo quiero hacer una consulta simple como select(xyc, abc).where(abc = 123).limit(20), pero en su lugar tengo que escribir una gran cantidad de código JavaScript para hacerlo. ¿Cómo se puede escribir su propio código para hacer combinaciones entre tablas, algún ejemplo en cualquier lugar?

He encontrado un jQuery plugin que puede hacer la vida más simple. ¿Hay otras alrededor u otras bibliotecas que alivien el dolor de usar IndexedDB?

¡Muchas gracias!

+1

Creo que WebSQL ha sido abandonado a favor de IndexedDB ... –

+1

Cuidado con WebSQL, Apple 5.0.1 ya no persiste Datos de WebSQL. En otras palabras, esto lisiará la base de datos local de su aplicación. Phonegap tiene una solución alternativa. https://issues.apache.org/jira/browse/CB-330 – Wytze

Respuesta

1

¿Ha considerado [Lawnchair] [1]? Proporciona una buena abstracción del almacenamiento subyacente, también hay complementos para consultar, agregar y paginar datos. Como un ejemplo de consulta:

// basic searching 
    this.where('record.name === "brian"', 'console.log(records)') 
    this.where('record.name != ?', username, 'console.log(records)') 

    // sorting results 
    this.where('name === "brian"').asc('active', 'console.log(records)') 

El único posible inconveniente que veo es que no aparece para manejar las migraciones y ser genérica no parecen tener una forma de crear índices etc.

Con respecto a las uniones, IndexedDB está diseñado para ser un documento orientado (No SQL) almacenar no una base de datos relacional, sin embargo dado que es un escenario común, parece que hay dos opciones:

1) Cursor iterar sobre los elementos de datos 2) Si lo anterior es demasiado lento, también podría crear un almacén de objetos de valor de clave dedicado que podría n ser utilizado para hacer una búsqueda indexada en la tienda relevante. Dependiendo de la cantidad de requisitos de participación que tenga, esto podría ser una tarea ardua.

+0

Gracias @Sidebp Lo he visto. Parece que admite el almacenamiento local de forma predeterminada. Mientras que preferiría WebSQL por defecto, ya que es mucho más rápido, pero no creo que haya una opción para cambiar el orden de los adaptadores. WebSQL puede consultar 200,000 filas en menos de 2 segundos. IndexedDB toma 15 segundos. El almacenamiento local se cuelga después de aproximadamente 10,000 filas. – zuallauz

4

Tengo un código abierto web database wrapper que admite IndexedDB y WebSql.

La migración de la versión se maneja por detrás del sentido. Los siguientes migra código (o inicializar) a la versión 2.

schema_ver2 = { 
    version: 2, 
    size: 2 * 1024 * 1024, // 2 MB 
    stores: [{ 
     name: 'ydn_obj', 
     keyPath: 'id.value', 
     indexes: [{ 
      name: 'age', 
      type: 'INTEGER' // type is require for WebSql 
     }] 
    }] 
} 
db = new ydn.db.Storage('db name', schema_ver2) 

Query es muy flexible y potente.Por ejemplo:

q = db.query('customer').when('age', '>=', 18 , '<', 25).where('sex', '=', 'FEMALE') 
young_girls = q.fetch(10, 2); // limit and offset 

De nuevo con consulta rango de teclas más eficiente si la edad es indexado:

q = db.query('customer', 'age').bound(18, 25, true).where('sex', '=', 'FEMALE') 

También soporta transaction.

p123 = db.tkey('player', 123); 
db.runInTransaction(function() { 
    p123.get().success(function(p123_obj) { 
     p123_obj.health += 10; 
     p123.put(p123_obj); 
    }); 
}, [p123]); 
0

Creo que JsStore funcionará para usted.

permite decir que su consulta se ve algo como esto en SQL -

SELECT * FROM nombre_tabla que column1 = límite 'abc' 20

En JsStore - será

var Connection = new JsStore.Instance("YourDbName"); 
Connection.select({ 
    From: "table_name" 
    Where: { 
     Column1: 'abc', 
    }, 
    Limit:20, 
    OnSuccess:function (results){ 
     console.log(results); 
    }, 
    OnError:function (error) { 
     console.log(error); 
    } 
}); 

Por lo que puede escribir sql como consulta usando JsStore.