`
24201219
  • 浏览: 2599 次
社区版块
存档分类
最新评论

在windows8、Android、IOS上使用indexedDB

阅读更多
最近手头上有个项目,需要使用到移动跨平台技术。在网络上搜罗了一下,发现有两个比较好的跨平台开发工具。

1、Cordova/PhoneGap
这两个其实是同一个项目,PhoneGap有部分的核心代码放到了Apache基金会开源,于是改名为Cordova。但PhoneGap依然是有团队继续开发。所以现在同时存在这两个项目。
Phonegap网址: http://phonegap.com/

2、Corona
游戏开发跨平台工具,主要用于游戏开发或者对性能要求比较高的应用也适合使用,只是暂时不支持windows8。
Corona 网址: http://www.coronalabs.com/

翻看了一下这两个工具的文档,都是英文的,看的偶眼花缭乱。对本地存储比较好的是Phonegap,支持Android、IOS上的websql,而windows8上支持indexedDB。由于w3c力推indexedDB,以后会放弃websql,于是我依然选择indexedDB作为本地存储的数据库。
但是Phonegap只支持Android、IOS上的websql,这个该怎么办呢?

答案是写一个中间适配的层,上层应用调用的是indexedDB的接口,通过这个中间层适配,在Android、IOS上下层会调用websql,而在windows8上调用的是indexedDB。这样不就解决了问题了吗。

为了避免重复制造轮子,我先google了一番,发现居然还真有人和我的想法一样,是个老外写的js库:IndexedDBShim.js 。我把它下载下来测试了一下,出来了一大堆问题,使用不了,其中一个最大的问题就是:
SECURITY_ERR: DOM Exception 18


出错地方是函数function openDB(oldVersion)中的这一句:
var db = window.openDatabase(name, 1, name, DEFAULT_DB_SIZE);
             
我们可以把该函数修改成Phonegap的接口调用方式,代码如下:
function openDB(oldVersion){
				document.addEventListener("deviceready", onDeviceReady_db, false);
				
				function onDeviceReady_db() {
        			
        			var db = window.openDatabase(name, 1, name, DEFAULT_DB_SIZE);
                req.readyState = "done";
                if (typeof version === "undefined") {
                    version = oldVersion || 1;
                }
                if (version <= 0 || oldVersion > version) {
                    idbModules.util.throwDOMException(0, "An attempt was made to open a database using a lower version than the existing version.", version);
                }
                
                db.transaction(function(tx){
                    tx.executeSql("CREATE TABLE IF NOT EXISTS __sys__ (name VARCHAR(255), keyPath VARCHAR(255), autoInc BOOLEAN, indexList BLOB)", [], function(){
                        tx.executeSql("SELECT * FROM __sys__", [], function(tx, data){
                            var e = idbModules.Event("success");
                            req.source = req.result = new idbModules.IDBDatabase(db, name, version, data);
                            if (oldVersion < version) {
                                // DB Upgrade in progress 
                                sysdb.transaction(function(systx){
                                    systx.executeSql("UPDATE dbVersions set version = ? where name = ?", [version, name], function(){
                                        var e = idbModules.Event("upgradeneeded");
                                        e.oldVersion = oldVersion;
                                        e.newVersion = version;
                                        req.transaction = req.result.__versionTransaction = new idbModules.IDBTransaction([], 2, req.source);
                                        idbModules.util.callback("onupgradeneeded", req, e, function(){
                                            var e = idbModules.Event("success");
                                            idbModules.util.callback("onsuccess", req, e);
                                        });
                                    }, dbCreateError);
                                }, dbCreateError);
                            } else {
                                idbModules.util.callback("onsuccess", req, e);
                            }
                        }, dbCreateError);
                    }, dbCreateError);
                }, dbCreateError);
    			}
				
                
            }



我写了一些测试代码,无非就是简单的增删查改。测试都顺利通过了。整个项目的代码我作为附件上传了,自己在下面下载吧。是在Android平台下,Eclipse开发工具的。要运行查看只需要到Android的开发官网下载ADT,打开项目就可以查看到运行结果了。


  • YSSS.7z (1.5 MB)
  • 描述: indexedDB跨平台框架
  • 下载次数: 22
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics