Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

indexedDB(伍) 修改数据库结构

  indexedDB的数据库结构一般是在创建数据库时设计好的。当我们创建数据库时会触发upgradeneeded事件,它相当于一个事务,我们可以在里面设计数据库结构。但是upgradeneeded事件对已经创建好的数据库不触发,那我们要如何修改数据库结构呢?
  要打开一个indexedDB我们需要调用open方法,open方法有两个参数,数据库名和版本号。实际上必要参数只要一个数据库名,版本号是可选参数。这就奇怪了,这个版本号到底是个啥?是indexedDB的版本?不,indexedDB哪有什么版本号!现代对象都是霸道升级主义的,他们不需要版本号。这里的版本号是开发者自己为数据库结构标识提供的版本号。看upgradeneeded这个事件的名称,upgrade needed,是指需要升级。我们创建数据库时候让它从0级升到指定了的等级就是一次升级,所以在创建数据库时会触发它。那么我们只要提升open时数据库的版本号就可以触发这个事件。
//这个演示涉及到本地存储,所以就不做在线运行的版本了

//尝试删除数据库MyDB
indexedDB.deleteDatabase("MyDB");

//后面定义了三个动作,他们会被链式的打开和关闭
test1(); //从test1开始调用

function test1(){
  //首次打开(默认版本号是最高版本)
  indexedDB.open("MyDB").onupgradeneeded=function(e){
    //创建Obj1对象存储
    e.target.result.createObjectStore("Obj1");
    e.target.result.close();
    test2();
  };
};
function test2(){
  //再次打开,设置版本号为2
  indexedDB.open("MyDB",2).onupgradeneeded=function(e){
    //创建Obj2对象存储
    e.target.result.createObjectStore("Obj2");
    e.target.result.close();
    test3();
  };
};
function test3(){
  //再加一个版本号重新打开
  indexedDB.open("MyDB",3).onupgradeneeded=function(e){
    //尝试再次创建Obj2对象存储
    try{
      e.target.result.createObjectStore("Obj2");
    }catch(e){
      //由于Obj2对象已经存在,此处会抛出异常
      console.log(e.message);
    };
    e.target.result.close();
  };
};

  虽然我们可以修改数据库,但也要合理操作,避免创建已经存在的数据库和删除不存在的数据库等这样的错误。最后还有个问题,我们现在把数据库弄到了第3版,那打开旧版本会怎么样呢?上面的演示最后并没有删除掉数据库,我们接着测试。
var cn=indexedDB.open("MyDB",1);
cn.onsuccess=function(e){
  console.log(e.target.result);
};
cn.onerror=function(e){
  console.log(e);
};

  结果是打不开!数据库提升版本后我们无法使用旧版本。这会触发连接的error事件,火狐下还会直接在open的地方抛出异常。
网名:
3.84.186.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^