2011-10-02 174 views
9

我需要爲iPad /平板電腦設備構建一個離線HTML5 Web應用程序,用戶可以從服務器下載數據集(數據表)並將其存儲在設備上。用戶可以從服務器斷開連接並在設備上本地查看/編輯數據。這適用於在沒有蜂窩覆蓋並需要收集/更新數據的偏遠地區工作的人員。當他們回到辦公室時,他們可以將數據同步/上傳回服務器。它需要成爲HTML5的原因是平臺不可知的,也就是說,只要它具有支持HTML5的現代網絡瀏覽器,就可以在iOS,Android等平臺上運行它。IndexedDB的包裝函數

現在我已經構建了使用HTML5本地存儲(用於數據)和HTML5脫機應用程序緩存(用於頁面/ css/js /圖像)的系統,並且它對小數據集(我可以查看,離線時編輯和保存,聯機時加載/同步)。現在我需要擴展到10,000行數據。它可以工作,但速度很慢,掛載瀏覽器的時間爲10秒,而在Intel四核8GB機器上加載。

所以,我一直在研究比本地存儲一些更好的選擇:

1)的WebSQL:將能夠使用SQL語言來查詢數據和執行連接等問題是它現在已經過時的,和不不再受到支持,所以我不想投入時間爲它建立一些東西。

2)IndexedDB:使用對象存儲(技術上,我已經使用本地存儲API存儲對象並使用JSON存儲)。由於它使用SQL lite後端的索引,因此可能會更快。有很多樣板代碼可以完成簡單的任務,比如創建數據庫,添加數據庫,讀取數據庫,迭代數據庫。我只想做一個簡單的查詢,如select(xyc, abc).where(abc = 123).limit(20),但是必須編寫大量JavaScript代碼才能完成。如何編寫自己的代碼來在表之間進行連接,以及任何地方的任何示例?

我發現一個jQuery plugin可能會使生活更簡單。有沒有其他的庫或其他庫可以緩解使用IndexedDB的痛苦?

非常感謝!

+1

我相信WebSQL已經放棄了贊成IndexedDB ... –

+1

注意WebSQL,Apple 5.0.1不再持久化WebSQL數據。換句話說,這會削弱你的應用的本地數據庫。 Phonegap有一個解決方法。 https://issues.apache.org/jira/browse/CB-330 – Wytze

回答

1

你有沒有考慮過[Lawnchair] [1]?它從底層存儲提供了一個很好的抽象,還有查詢,聚合和分頁數據的插件。作爲查詢的一個例子:

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

唯一潛在的缺點,我可以看到的是,它似乎並沒有處理移民和被一般不會出現在創建索引等

的方式關於連接,IndexedDB被設計爲面向文檔(無SQL)存儲而不是關係數據庫,但是鑑於這是一種常見的情況,它看起來有兩種選擇:

1)光標迭代數據項 2)如果上面的速度太慢,你也可以創建一個專用的鍵值對象存儲, n用於在相關商店中進行索引查找。根據您的加入需求數量,這可能是一件苦差事。

+0

謝謝@Sidebp我已經看過它。它似乎默認支持本地存儲。而我更喜歡它是否默認使用WebSQL,因爲它速度更快,但我不認爲有更改適配器順序的選項。 WebSQL可以在2秒內查詢200,000行。 IndexedDB需要15秒。本地存儲在大約10,000行後掛起。 – zuallauz

4

我有一個開源的web database wrapper它支持IndexedDB和WebSql。

版本遷移在sense之後處理。以下代碼遷移(或初始化)到版本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非常靈活和強大。例如:

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

再次用更高效的鍵範圍查詢,如果年齡是索引:

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

它還支持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

我認爲JsStore會爲你工作。

比方說,您的查詢看起來像這樣在SQL -

SELECT * FROM表名,其中列1 = 'ABC' 極限20

JsStore - 這將是

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

所以你可以使用JsStore來編寫sql查詢語句。