2011-10-02 21 views
9

Potrzebuję zbudować aplikację internetową HTML5 offline dla urządzenia iPad/tablet, na którym użytkownik może pobrać zestaw danych (tabelę danych) z serwera i zapisać go na urządzeniu. Użytkownik może następnie odłączyć się od serwera i wyświetlić/edytować dane lokalnie na urządzeniu. Dotyczy to osób, które pracują w odległych obszarach, w których nie ma zasięgu sieci i muszą zbierać/aktualizować dane. Po powrocie do biura mogą zsynchronizować/przesłać dane z powrotem na serwer. Powodem, dla którego musi to być HTML5, jest agnostyka platformy, tzn. Może działać w systemie iOS, Android itp., O ile ma nowoczesną przeglądarkę obsługującą HTML5.Funkcje opakowania dla IndexedDB

Mam już zbudowany system przy użyciu lokalnej pamięci HTML (dla danych) i pamięci podręcznej aplikacji HTML5 (dla stron/css/js/images) i działa dość dobrze z małymi zestawami danych (mogę wyświetlić , edytuj i zapisuj w trybie offline oraz ładuj/synchronizuj w trybie online). Teraz muszę skalować do 10 000 wierszy danych. Działa, ale działa dość wolno i zawiesza przeglądarkę na 10sekund podczas ładowania na czterordzeniowym cztero-rdzeniowym komputerze Intel.

Więc byłem badania kilka lepszych alternatyw niż lokalnego przechowywania:

1) WebSQL: będzie w stanie kwerendy danych za pomocą języka SQL i wykonać przyłącza itd. Problem polega na tym, że teraz nie będzie przestarzałe być dłużej wspieranym, więc nie chcę poświęcać czasu na budowanie czegoś.

2) IndexedDB: Używa składnicy obiektów (której technicznie już przechowuję obiekty przy użyciu lokalnego interfejsu API pamięci masowej i przechowuję za pomocą JSON). Potencjalnie jest szybszy, ponieważ używa indeksów z backendem SQL Lite. Jest wiele podstawowych kodów do wykonywania prostych zadań, takich jak tworzenie bazy danych, dodawanie do niej, czytanie z niej, iterowanie nad nią. Po prostu chcę zrobić proste zapytanie, takie jak select(xyc, abc).where(abc = 123).limit(20), ale zamiast tego trzeba napisać dużo kodu JavaScript, aby to zrobić. W jaki sposób można napisać własny kod, aby robić połączenia między tabelami, dowolne przykłady w dowolnym miejscu?

Znalazłem jeden jQuery plugin, który może uprościć życie. Czy są jakieś inne biblioteki lub inne, które ułatwiają korzystanie z IndexedDB?

Wielkie dzięki!

+1

Wierzę, że WebSQL został porzucony na rzecz IndexedDB ... –

+1

Uważaj na WebSQL, Apple 5.0.1 już nie utrzymuje danych WebSQL. Innymi słowy, spowoduje to okaleczenie lokalnej bazy danych aplikacji. Phonegap ma obejście. https://issues.apache.org/jira/browse/CB-330 – Wytze

Odpowiedz

1

Czy brałeś pod uwagę [Lawnchair] [1]? Zapewnia ładną abstrakcję z pamięci bazowej, istnieją również wtyczki do wyszukiwania, agregowania i dzielenia danych na strony. Jako przykład zapytań:

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

Jedyną potencjalną wadą widzę jest to, że nie wydaje się, aby obsłużyć migracje i jest rodzajowy nie wydaje się mieć sposób tworzenia indeksów itp

Jeśli chodzi o sprzężenia, IndexedDB ma być magazynem zorientowanym na dokumenty (bez SQL), a nie relacyjną bazą danych, jednak biorąc pod uwagę, że jest to typowy scenariusz, wydaje się, że istnieją dwie opcje:

1) Kursor iteruje po elementach danych 2) Jeśli powyższe jest zbyt wolne, możesz również utworzyć dedykowany magazyn obiektów wartości klucza, który może n należy użyć, aby wykonać indeksowane wyszukiwanie w odpowiednim magazynie. W zależności od liczby wymagań dotyczących łączenia, może to być uciążliwe.

+0

Dzięki @Sidebp Widziałem to. Wygląda na to, że domyślnie obsługuje pamięć lokalną. Podczas gdy ja wolałbym, gdyby WebSQL działał domyślnie, ponieważ jest o wiele szybszy, ale nie sądzę, że istnieje opcja zmiany kolejności kart. WebSQL może wykonywać zapytania 200 000 wierszy w mniej niż 2 sekundy. IndexedDB trwa 15 sekund. Pamięć lokalna zawiesza się po około 10 000 wierszy. – zuallauz

4

Mam open source web database wrapper, który obsługuje zarówno IndexedDB i WebSql.

Migracja wersji odbywa się za sensem. Następujące migruje hasła (inicjacja) do wersji 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 jest bardzo elastyczny i skuteczny.Na przykład:

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

Znowu bardziej efektywne zapytania zakresu kluczowego jeśli wiek jest indeksowana:

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

również wspierać 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

Myślę, że JsStore będzie działać dla Ciebie.

Powiedzmy zapytanie wygląda coś takiego w SQL -

select * from nazwa_tabeli gdzie kolumna1 = granica 'abc' 20

W JsStore - To będzie

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

Więc można napisać kwerendę sql jak przy użyciu JsStore.

Powiązane problemy