Phonegap及浏览器端database容量限制问题

移动开发
phonegap及浏览器端database容量限制问题是本文要介绍的内容,主要是来了解phonegap database的使用方法,具体内容的实现来看本文详解。

phonegap浏览器database容量限制问题是本文要介绍的内容,主要是来了解phonegap database的使用方法,具体内容的实现来看本文详解。

关于phonegap:

androidIOS提供了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

  1. database = function() {  
  2.    this.queryQueue = {};  
  3.     }  
  4. window.opendatabase = function(){return new database();} 

将sql调用发送到后端,利用phonegap提供的框架支持:

  1. PhoneGap.exec(null, null, "database", "executeSql", [sql, params, trackId]); 

提供一个用于ios后端传递运行结果的钩子:

  1. function executeSqlSuccessIOSCallback(dataObj){...} 

这个调用会构造出一个不可见的iframe,iframe对外发出的url请求会被ios后端捕获。

ios后端

相应js调用,利用phonegap提供的框架支持,扩展phonegapCommand

  1. @interface database : PhoneGapCommand {}  
  2. -(void) executeSql:(NSMutableArray *)arguments withDict:(NSMutableDictionary*)options;  
  3. @end 

注意这里的参数是固定的,方法名对应js调用中的第四个参数,有一种调用就实现一个对应的方法

当executesql产生结果时,调用webview的执行js的接口,把结果放入executeSqlSuccessIOSCallback的参数中,从而使页面知道sql执行完毕并拿到结果

保证执行序列一致

js调用中附加了一个trackId,这个可以根据当前时间来生成,可以用来排序。不过目前来看似乎也没用.

websql api中,sql执行都是在某个事务中进行的,而sqlite作为单文件全局写锁的数据库,同一个时间只能有一个事务在执行,其他事务必须要等待依次执行,因此队列是必须的。

小结:Phonegap浏览器database容量限制问题的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: 博客园
相关推荐

2013-11-05 10:22:20

浏览器加密

2023-08-28 08:00:00

人工智能AgentGPT

2012-03-20 11:07:08

2017-04-06 15:40:31

客户端数据存储技术

2012-03-20 11:31:58

移动浏览器

2012-03-19 17:25:22

2012-03-20 11:41:18

海豚浏览器

2022-08-30 09:01:11

浏览器渲染前端

2023-12-12 09:45:16

前端浏览器

2012-03-19 17:17:00

移动浏览器欧朋

2012-03-20 11:22:02

QQ手机浏览器

2013-11-20 14:25:45

浏览器重绘

2012-06-21 15:38:02

猎豹浏览器

2010-04-05 21:57:14

Netscape浏览器

2011-12-14 10:01:32

浏览器历史

2016-01-05 12:54:52

浏览器浏览器端缓存

2012-03-20 11:35:32

傲游手机浏览器

2010-09-15 09:43:24

Javascript浏览器兼容

2010-08-11 13:35:10

JavaScriptCSS

2010-03-03 15:57:23

点赞
收藏

51CTO技术栈公众号