1

我正在尝试在 Chrome 中创建一个书签扩展,并且我想利用 WebSQL 在本地存储有关书签的各种信息。这是我到目前为止所做的:

(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。

4

2 回答 2

0

以我有限的经验,changeVersion 确实适用于 Chrome。我也在这里阅读了有关它在 Safari 上无法正常工作的投诉,但确实如此。

但是,有两个问题:

捕获 1:

通常,changeVersion似乎失败(它给出错误并且 db.version 仍将返回旧值),但事务回调将触发,并且当您重新打开网页及其数据库时,版本号将是正确的。

捕获 2:

看来您必须提供准确的五个参数,包括三个回调。如果你不提供这五个参数,例如你只做前三个,那么当前版本将保持不变。因此,如果您按照每个人都提到的本教程中的说明进行操作,您会感到失望。

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

参数有: 1:预期版本 2:新版本 3:事务回调(您可以在此处执行 SQL 作为版本更改的一部分) 4:失败回调(如果版本更改或事务回调失败) 5:成功回调(如果版本更改和交易回调成功)

我尚未在 iOS 设备上对此进行测试,但它符合此处提供的 Safari 规范: https ://developer.apple.com/library/safari/#documentation/iphone/conceptual/safarijsdatabaseguide/usingthejavascriptdatabase/usingthejavascriptdatabase.html

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

于 2012-06-21T10:24:13.203 回答
0

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

并且根据调用 creationCallback 中的规范(在您的情况下,函数 onDBInit)版本的数据库暴露给一个空字符串:

无论给定的数据库版本如何,都会使用具有空字符串作为其版本的数据库调用回调

这个错误是两年前发现并详细描述的,但仍未纠正。

我通过以下方式决定了这个问题:我删除了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)');
});
于 2015-08-07T03:53:08.757 回答