Phonegap及瀏覽器端database容量限制問題
phonegap及瀏覽器端database容量限制問題是本文要介紹的內容,主要是來了解phonegap database的使用方法,具體內容的實現來看本文詳解。
關于phonegap:
android和IOS提供了webview視圖,它可以用來展示網頁,支持HTML5。
phonegap正是使用webview來完成對html和css的包裝的。
phonegap允許網頁使用系統級別的功能,如加速器,文件系統等,但這些功能的使用會拖慢運行效率。
phonegap目前并不能真正做到“一次書寫,到處運行”,有些API只支持部分平臺,有些已經提供的API會因為平臺的差異有不同的行為。
phonegap 可以做到無縫升級, 不過需要自己實現升級代碼
關于網頁對于數據庫容量的限制:
native app中展示網頁,使用的數據庫是屬于這個app而不是瀏覽器的
Android:
phonegap在android平臺上,有如下表現:
1. native app中展示網頁,可以通過window.opendatabase()申請容量超過5MB的數據庫
2. 如果因為數據變更導致超出了申請的容量,當前的事務操作會失敗,然后android調用鉤子方法重新設置容量大小。其中:
(1)1.x系統容量不變
(2)2.x系統以上容量增加,上限為100MB
IOS:
phonegap在ios平臺上不提供對database的額外處理。
native app中展示網頁,網頁所使用的database,limit為5MB,超出這個限制,操作會默默的失敗,并且目前沒有可以改變這個限制的方法。
ios中要想使用50MB的數據庫,必須通過web app方式,除非自行開發功能,將database操作映射到系統的database上。但是由于ios系統的限制,自行開發工作量大。
IOS中webview突破database size的5M限制
當在safari中申請超過5m大小的空間時,會彈出提醒讓用戶確認,但webview中卻只是默默的失敗。其實5M大小基本也夠用了,但如果應用的多媒體內容很多,這點容量則會顯得捉襟見肘。如果非要用webview不可,非要突破這個5M限制不可,就可以像下面這樣折騰。
雖然兩者使用的是同一個瀏覽器核心,但是webview在有些細節上和safari會不相同,如果要把webapp直接包裝移植成native app,會有點麻煩。
由于目前沒有方法通過操作webview對象來放寬database size的限制,所以需要考慮調用ios系統的sqlite數據庫:當網頁依照websql的api調用database.transaction的時候,調用請求由app而不是瀏覽器(webview)去處理。
因此在ios上,需要覆蓋opendatabase的實現,返回定制過的database對象,這個對象將把所有的sql調用發送到ios后端,并響應執行結果。執行序列要保證一致,事務完整性必須被支持。
js前端
覆蓋database
- database = function() {
- this.queryQueue = {};
- }
- window.opendatabase = function(){return new database();}
將sql調用發送到后端,利用phonegap提供的框架支持:
- PhoneGap.exec(null, null, "database", "executeSql", [sql, params, trackId]);
提供一個用于ios后端傳遞運行結果的鉤子:
- function executeSqlSuccessIOSCallback(dataObj){...}
這個調用會構造出一個不可見的iframe,iframe對外發出的url請求會被ios后端捕獲。
ios后端
相應js調用,利用phonegap提供的框架支持,擴展phonegapCommand
- @interface database : PhoneGapCommand {}
- -(void) executeSql:(NSMutableArray *)arguments withDict:(NSMutableDictionary*)options;
- @end
注意這里的參數是固定的,方法名對應js調用中的第四個參數,有一種調用就實現一個對應的方法
當executesql產生結果時,調用webview的執行js的接口,把結果放入executeSqlSuccessIOSCallback的參數中,從而使頁面知道sql執行完畢并拿到結果
保證執行序列一致
js調用中附加了一個trackId,這個可以根據當前時間來生成,可以用來排序。不過目前來看似乎也沒用.
websql api中,sql執行都是在某個事務中進行的,而sqlite作為單文件全局寫鎖的數據庫,同一個時間只能有一個事務在執行,其他事務必須要等待依次執行,因此隊列是必須的。
小結:Phonegap及瀏覽器端database容量限制問題的內容介紹完了,希望通過本文的學習能對你有所幫助!