2012-04-07 129 views
1

我试图在Chrome中创建书签扩展,我想利用WebSQL在本地存储有关书签的所有类型的信息。这是我到目前为止已经完成:WebSQL changeVersion总是失败

(function() { 
    var Home, 
    __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; 

    window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; 

    Home = (function() { 

    function Home() { 
     this.onDBInit = __bind(this.onDBInit, this);  this.db = openDatabase("Journal", "", "Bookmarks Stats", 5 * 1024 * 1024, this.onDBInit, this.onDBError); 
    } 

    Home.prototype.onDBInit = function(db) { 
     console.log(db.version); 
     db.changeVersion("", "1.0", this.initDB, this.onDBError); 
     return console.log(db); 
    }; 

    Home.prototype.initDB = function(t) { 
     console.log(t); 
     return t.executeSql('CREATE TABLE bookmarks (id, title, url)'); 
    }; 

    Home.prototype.onDBError = function(e) { 
     return console.log(e); 
    }; 

    return Home; 

    })(); 

    window.Registerable(Home); 

}).call(this); 

出于某种原因,changeVersion 总是失败。我试图删除数据库,重新启动Chrome等。Chrome版本:18.

+0

你有没有解决这个问题? – 2012-06-13 08:49:21

+0

我想我做了..这太长了。我认为第一个参数需要类似“1.0”...无论如何,webSQL已被弃用,你可能想尝试其他替代方法,如indexedDB维护:http://www.w3.org/TR/IndexedDB/ – 2012-06-16 23:47:24

回答

0

以我有限的经验,changeVersion在Chrome上工作。我也读过投诉here,说它在Safari上无法正常工作,但确实如此。

但是,有两个卡口:

捕获1:

通常,changeVersion 出现失败(它提供了一个错误,并db.version仍会返回旧值),但成交回拨将触发,当您重新打开网页及其数据库时,版本号将是正确的。

捕获2:

看来你必须提供精确的五个参数,其中包括三个回调。如果你不提供这五个参数,例如你只做前三个,那么当前版本将保持不变。所以如果你按照所有人都提到的this tutorial的说明,你会感到失望。

这就是Windows上的Chrome和Safari的情况。

参数是: 1:预期的版本 2:新版本 3:交易回调(你可以在这里执行SQL的版本变化的一部分) 4:失败的回调(如换版或交易回调失败) 5:更迭回调(如果版本的变化和交易的回调成功)

我没有测试过这在iOS设备上,但它符合此处提供的Safari浏览器规格: ​​

Opera,changeVersion等待将db.version设置为其新值,直到使用executeSql执行实际的sql事务之后。所以我使用了一个没有进一步结果的SELECT语句。这实际上并不一定在事务回调中:当我尝试了一大堆changeVersion命令后,在浏览器控制台中尝试单独的executeSql语句时,我发现了它。

+0

谢谢回答。我不记得我做了什么,但这确实响起了一个钟声(五个参数是强制性的) – 2012-08-11 13:35:48

0

这是Chrome bug:您无法使用值中的空字符串更改数据库的版本。

并根据呼叫creationCallback的specifications(在你的情况下,该功能onDBInit)版本的数据库暴露在空字符串:

回调被调用,具有空字符串数据库作为其版本,无论给定的数据库版本

是两年前described in detail检测到这个错误,但仍不改正

我通过以下方式决定了此问题:我删除了creationCallback的数据库结构的初始化,并将它作为数据库的第一个事务。

var db = openDatabase("Journal", "0.1", "Bookmarks Stats", 5 * 1024 * 1024); 
db.transaction(function (t) { 
    t.executeSql('CREATE TABLE IF NOT EXISTS bookmarks (id, title, url)'); 
});