2011-10-02 8 views
9

È necessario creare un'applicazione Web HTML5 offline per un dispositivo iPad/tablet in cui l'utente può scaricare un set di dati (tabella di dati) dal server e memorizzarlo sul dispositivo. L'utente può quindi disconnettersi dal server e visualizzare/modificare i dati localmente sul dispositivo. Questo è per le persone che lavorano in aree remote dove non c'è copertura cellulare e devono raccogliere/aggiornare i dati. Quando tornano in ufficio possono sincronizzare/caricare i dati sul server. La ragione per cui deve essere HTML5 è quindi la piattaforma agnostica, cioè può essere eseguita su iOS, Android ecc. Purché disponga di un browser Web moderno che supporti HTML5.Funzioni wrapper per IndexedDB

Ora ho già creato il sistema utilizzando la memoria locale HTML5 (per i dati) e la cache di applicazioni offline HTML5 (per le pagine/css/js/images) e funziona abbastanza bene con piccoli set di dati (posso vedere , modifica e salva offline e carica/sincronizza online). Ora ho bisogno di scalare fino a 10.000 file di dati. Funziona ma è piuttosto lento e blocca il browser per 10 secondi mentre carica su un computer Intel quad core da 8 GB.

Così Ho fatto ricerche alcune alternative migliori di archiviazione locale:

1) WebSQL: sarebbe in grado di interrogare i dati utilizzando il linguaggio SQL e fare si unisce, ecc Il problema è che è ora sconsigliato un no essere supportato più a lungo quindi non voglio investire tempo a costruire qualcosa per questo.

2) IndexedDB: utilizza un archivio oggetti (che tecnicamente sto già archiviando oggetti utilizzando l'API di archiviazione locale e l'archiviazione utilizzando JSON). Potenzialmente è più veloce in quanto utilizza gli indici con il backend SQL lite. C'è un sacco di codice boilerplate per svolgere compiti semplici come la creazione del database, aggiungendo ad esso, leggendo da esso, iterando su di esso. Voglio solo fare una semplice query come select(xyc, abc).where(abc = 123).limit(20) ma invece devo scrivere un sacco di codice JavaScript per farlo. Come si scrive il proprio codice per fare join tra tabelle, qualche esempio dovunque?

Ho trovato uno jQuery plugin che potrebbe semplificare la vita. Ce ne sono altri in giro o altre librerie che allevia il dolore dell'uso di IndexedDB?

Grazie mille!

+1

Credo che WebSQL sia stato abbandonato in favore di IndexedDB ... –

+1

Attenzione per WebSQL, Apple 5.0.1 non persiste più dati WebSQL. In altre parole, questo danneggerà il database locale della tua app. PhoneGap ha una soluzione alternativa. https://issues.apache.org/jira/browse/CB-330 – Wytze

risposta

1

Avete considerato [Lawnchair] [1]? Fornisce una bella astrazione dallo storage sottostante, ci sono anche plugin per l'interrogazione, l'aggregazione e la paginazione dei dati. Come esempio di interrogazione:

// 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)') 

L'unico inconveniente potenziale posso vedere è che non sembra gestire migrazioni ed essendo generico non sembra avere un modo di indici creando ecc

Per quanto riguarda i join, IndexedDB è progettato per essere un archivio orientato ai documenti (No SQL) non un database relazionale, tuttavia dato che questo è uno scenario comune appare ci sono due opzioni:

1) Cursore iterato sugli elementi di dati 2) Se quanto sopra è troppo lento, potresti anche creare un archivio oggetti valore chiave dedicato che potrebbe n essere usato per fare una ricerca indicizzata nel negozio pertinente. A seconda del numero di requisiti di partecipazione che hai, questo potrebbe essere un lavoro ingrato.

+0

Grazie a @Sidebp l'ho guardato. Sembra che supporti la memoria locale per impostazione predefinita. Considerando che preferirei se avesse WebSQL per impostazione predefinita in quanto è molto più veloce, ma non credo che ci sia un'opzione per cambiare l'ordine degli adattatori. WebSQL può interrogare 200.000 righe in meno di 2 secondi. IndexedDB richiede 15 secondi. L'archiviazione locale si blocca dopo circa 10.000 righe. – zuallauz

4

Ho un open source web database wrapper che supporta sia IndexedDB che WebSql.

La migrazione della versione viene gestita dietro ai sensi. I seguenti migra codice (o inizializzare) alla versione 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 è molto flessibile e potente.Ad esempio:

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

Sempre con interrogazione gamma chiave più efficace se l'età è indicizzato:

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

'anche il supporto 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

Penso che JsStore funzionerà per voi.

permette di dire la query simile a questa in SQL -

select * from table_name dove column1 = limite 'abc' 20

In JsStore - sarà

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); 
    } 
}); 

Così si puoi scrivere query sql like usando JsStore.