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