2011-10-12 69 views
74

問題:發展爲iOS/Android上HTML5離線存儲在溶液2011

我需要用於在電話或平板型存儲和查詢250,000+行的數據脫機的不可知的設備(例如HTML5)溶液設備(例如iOS/Android)。我的想法是,有人在沒有任何蜂窩數據連接的偏遠地區工作,他們需要對這些數據運行查詢並在離線時進行編輯。部分將基於地理位置,所以如果他們所在區域有資產(使用GPS),那麼它將顯示這些資產並讓它們進行編輯。當他們返回辦公室時,他們可以將數據同步回辦公室服務器。

我從網絡標準的角度來看待這個問題的原因基本上是通過在HTML5中編寫一次,然後在多個平臺上工作而不是在Objective C和Java中編寫兩次,從而節省資金和時間。另外,如果你寫的東西是平臺不可知的,那麼你就沒有被鎖定,當每個人轉向更新的時候,不要隨着船停下來。我們爲Windows Mobile 5編寫了一個類似的應用程序,現在它無用,因爲該平臺已經死亡。

設備上的脫機數據庫需要:

  • 快(在2秒的響應)
  • 潛在執行連接,並具有與其它表能夠查詢數據庫內
  • 選擇數據關係一定的範圍或標準,例如由x & y座標基於GPS讀數。

選項:

HTML5本地存儲:

精細的少量數據< 5000鍵/值的,你甚至可以儲存陣列/它的對象如果轉換它到JSON。

缺點:

  • 在超過10,000行甚至高端機上的瀏覽器將 慢如蝸牛。
  • 無法對數據執行復雜查詢以提取所需的數據,因爲您必須遍歷整個存儲並手動搜索它。
  • 限制與可存儲

的Web SQL數據庫的存儲量:

  • 符合要求。
  • 快速對250000行(1-2secs)
  • 可以創建複雜的查詢,聯接等
  • 支持Safari瀏覽器,Android和歌劇院等都將在iOS和Android設備

工作運行查詢缺點:

  • 棄用2010年11月
  • 安全漏洞跨目錄攻擊。不是真的,因爲我們不會對一個問題共同主辦

IndexedDB的:

鍵/值對象存儲類似於本地存儲除非索引。

缺點:

  • 慢到200,000行(15-18secs)運行一個查詢
  • 無法運行復雜的查詢
  • 不能做與其他表聯接
  • 不受主要手機或平板電腦設備的支持,例如的iPad/Android的
  • 標準不完全

這使得實現棄用的網絡SQL方法,其可以僅一年左右工作的唯一選擇。 IndexedDB和本地存儲目前無法使用。

我不確定Mozilla和微軟如何取消Web SQL數據庫標準,以及W3C爲什麼讓它發生。據說他們之間有77%的桌面瀏覽器市場。在高級移動設備上,Mozilla和Microsoft幾乎沒有影響,因爲Safari, Opera and Android have over 90% of the market share。微軟可以決定哪種標準應該在移動市場中使用,這是最有可能使用離線存儲的地方,這沒有任何意義。

comments from Mozilla關於他們爲什麼想要使用IndexedDB的原因主要是關於'開發人員美學',他們不喜歡在JavaScript中運行SQL的想法。我不買它。

  1. 目前提出的標準比較低級,而且非常基本的NoSQL實現很慢,甚至不支持人們在數據庫中需要的高級功能。有許多樣板代碼可以建立數據庫並獲取數據,但他們聲稱人們會在其頂部編寫一些很好的抽象庫來提供更高級的功能。截至2011年10月,他們無處可見。

  2. 他們已經棄用了現有的Web SQL標準,它實際上在主要的移動/平板電腦瀏覽器中運行並實現。而他們的「新」和「更好」標準在主流移動瀏覽器中不可用。

  3. 作爲開發人員,我們應該在未來3 - 5年內使用什麼樣的應用程序?IndexedDB規範可能會被標準化,具有更多功能,在主流移動/平板電腦瀏覽器中實現,並且有一些不錯的庫讓事情變得更容易?

W3C應該保持Web SQL數據庫標準並行運行,並解決問題。它已經支持主要的移動平臺,並且工作得很好。 Mozilla和微軟作爲擁有最多桌面瀏覽器份額的兩家玩家能夠獲得此標準的事實相當可疑,可以被視爲阻礙移動網絡平臺進展的一種嘗試,直到他們能夠趕上和提供針對iOS/Safari和Android的競爭解決方案。

總之有沒有人有我的問題的解決方案,適用於iOS/Android的手機/平板電腦設備。也許一個很好的包裝API,可以在後臺使用多個數據庫實現查詢功能,它可以讓你選擇哪個數據庫具有優先權。我已經看到了諸如lawnchair之類的東西,但我確定它只允許您默認使用本地存儲並回退到其他位置。我想我寧願使用Web SQL(默認情況下),然後選擇較慢的選項。

任何解決方案的幫助非常感謝,謝謝!

+5

寫得很好的文章!這是本地應用程序贏得原生應用程序和網絡應用程序參數的那些情況之一 - 但我知道你不想聽到這種情況。在這種情況下,根據我的知識,Web SQL是最好的選擇 - 我還會強制用戶下載與他們將要訪問的位置相關的行,而不是整個數據庫 - 如果您認爲他們可能需要更新某處連接,更不用說通過數據庫1/5大小(不確定數據庫的規模)搜索速度的增加 – amcc

+2

他們不能用WebSQL「解決問題」,因爲標準的一個要求推進到W3C推薦狀態是「獨立的和可互操作的實現」。由於規範基本上是「做SQLite做的事情」,這是永遠不會發生的。 – robertc

+0

@Vanthel謝謝是的,最好的地區已經分開,所以它的加載在所有數據的一個子集,但最大的地區仍然約250,000行。我想他們甚至可能會被打破。 – zuallauz

回答

17

我建議檢查JayData庫,實際上它的確切目的是爲移動設備創建存儲不可知的數據訪問層。 JayData提供了一個具有JavaScript Language Query (JSLQ)和JavaScript CRUD支持的抽象層,讓您以不同的離線和在線數據存儲類型完全相同的方式工作。 JayData支持處理複雜的實體以及本地或遠程的實體關係。

在撰寫JayData的時間支持以下商店或協議:的WebSQL(SQLITE)/索引資料/的OData/YQL/FBQL。

你與不同的系統提供不同的存儲引擎特定的問題可以用JayData的提供後備功能很容易解決:它會使用任何存儲層,它可以找到,同時還提供了對消費者的代碼相同的API。

提供有關的WebSQL被棄用,到2012年:在寫它的時間的WebSQL仍然有95%的設備覆蓋範圍包括三星的SmartTV和亞馬遜的Kindle。 Check out kindle executing WebSQL unit tests with JayData

+0

我同意,JavaScript語言查詢支持和提供者模型使JayData庫成爲HTML5脫機存儲解決方案的理想選擇。 – 2012-05-18 10:56:49

+0

更新:JayData現在也支持HTML5 localStorage。 [JayData庫](http://jaydata.org)執行JSON字符串化/解析作業,並提供乾淨,統一的數據管理API和概念。 – Robesz

+1

我很樂意將您的答案作爲可接受的答案,因爲它聽起來確實需要什麼,但是您是否擁有大型數據庫的任何性能基準250,000行?我想知道它是否可以使用IndexedDB和WebSQL底層存儲(取決於設備)處理多行,然後根據某些條件花費多長時間來執行基本的「where」類型查詢以查找其中一行。 – zuallauz

13

我會簽出CouchBase Lite。這是一個在Android和iOS上運行的功能齊全的CouchDB

iOS

Android

如果包裹你的App在像PhoneGap你可以爲這兩個平臺創建本地HTML 5個應用程序和你只需要做的Android/iOS的特定編程的一點點實現CouchDB。

優點:

橫跨多行數據查詢
  • 快速視圖引擎。
  • 污垢簡單而功能強大的複製支持出爐

缺點:

  • key-value存儲 - 這將需要一些時間來適應。
+0

謝謝,聽起來它可以工作,然而你[需要一個Mac系統](https://build.phonegap.com/docs/ios-builds)我相信爲它開發和生產的鑰匙等?我們沒有任何Mac。 – zuallauz

+0

CouchDB非常有趣,但我不相信它的索引(「視圖」)更新懶惰(由查詢或批處理觸發)的模型非常適用。我見過的大多數應用程序都假設一旦添加了一些數據,就可以有效地查詢數據,而其他大多數NoSQL數據庫將更多工作推入寫入事務中,以便讀取事務更快。 – RichVel

+0

@RichVel:根據我的經驗,視圖更新從未成爲移動設備的問題。這就是說,使用CouchDB或TouchDB的最大理由之一就是使用超級強大且易於使用的複製。 – rwilliams

1

爲什麼不寫一個簡單的JavaScript存儲引擎(它涵蓋了「基於標準」的部分)?顯然你不需要任何特別的東西,所以它不應該花費太多精力才能使它工作。

我會做到以下幾點:

  • 在BSON商店一切或類似的二進制格式。
  • 解析並在文件中創建索引,並在啓動時讀取。
  • 使用javascript進行查詢,並從您的(離線明顯的)Web應用程序的大文件中讀取。
  • 分別存儲更新的對象。

該解決方案只有在數據庫足夠簡單的情況下才可行。但我認爲它可能會工作 - javascript支持在移動設備上很好。

靈感​​是javascript中的一個Btree +實現。

要閱讀本地文件,您將需要file API,可用於access local files。它在大多數現代瀏覽器中都支持,即使是Safari 6。雖然我目前還無法確定當前的iPhone瀏覽器是否支持此API。

+0

手機上的JavaScript如何訪問文件系統的讀/寫設備? – zuallauz

+1

好點。顯然,File API並不像看起來那麼遠,但我的答案可能有點過於樂觀。 CouchBase看起來像一個更安全的賭注。 – alexfernandez

2

我會告訴你爲它使用Corona。這是一個用於交叉移動應用程序的私有平臺,它支持SQLite。

優點

  • 這很容易和有SQLite的一個很大的支持,並不需要做奇怪的事情HTML5的存儲

缺點

  • 你必須支付它如果你想在Android Market或iOS Market中使用它。

我貼在這裏,他們說些什麼吧:

電暈包括所有平臺上的SQLite數據庫的支持。這是基於iPhone上的內置sqlite支持的 ,以及Android上編譯的 版本的SQLite。請注意,這會將Android二進制文件的大小增加300K。

SQLite是在Android設備,iPhone和iPad的所有版本,如 以及在電暈模擬器......

2

「我見過的東西像lawnchair,但我敢肯定它只允許你在默認情況下使用本地存儲並回退到其他地方,我想我寧願使用Web SQL(默認情況下),然後選擇較慢的選項。「

這是可配置的,存儲引擎的每個「適配器」都是自包含的,您可以將適配器傳遞給Lawnchair構造函數,或者,也可以通過將其連接回其他存儲選項來更改其順序JavaScript文件在創建庫時有所不同。例如對於索引-DB,然後回落到SQLite的齒輪再源碼:

git clone https://github.com/brianleroux/lawnchair.git 
cd lawnchair 
cat src/Lawnchair.js src/adapters/indexed-db.js src/adapters/webkit-sqlite.js src/adapters/gears-sqlite.js > my_lawnchair.js 

當然,作爲其他的答案表明,你可以使用PhoneGap的等等,那麼你將有很多選擇包裝你的HTML5到本機應用程序,但是如果你想堅持Web標準,那麼這可能是一個很好的方式,直到我們廣泛採用IndexedDB。

1

這一點,實在值得看看我的開源庫https://bitbucket.org/ytkyaw/ydn-db/wiki/Home

的Javascript數據庫模塊是IndexedDB,WebDatabase(的WebSQL)和WebStorage(LocalStorage)刊登支持版本的遷移,先進的查詢和交易的存儲機制。

是NoSQL的圖書館,加盟是手動的,但並非不可能。庫中已經有關鍵連接算法。

+0

如果在代碼中我需要執行一個SQL查詢來檢索一些數據並對其進行排序,但是我的設備正在運行IndexedDB,那麼您的庫是否可以將該SQL查詢轉換爲將從IndexedDB數據庫獲取數據的SQL查詢? – zuallauz

+0

我的庫中的SQL支持是非常基本的。請在這裏看到它可以http://dev.yathit.com/ydn-db/sql-query.html –

6

我做了一些調查研究,同時尋找我自己的項目的解決方案。 它看起來像這個庫是相當有前途的:http://nparashuram.com/IndexedDBShim/

它允許在幕後使用具有WebSQL的IndexedDB API。

它的測試都通過了最近的iPad,iPhone 5的Android 4.2.2。

希望這可以幫助別人。

+0

晚會,但我也建議indexeddbshim.js。在Cordova/PhoneGap環境中,它可以在iOS和Android上提供單一解決方案。 –