Javascript IndexedDB:您可以手动启动版本更改事务吗?

Javascript IndexedDB:您可以手动启动版本更改事务吗?,javascript,html,javascript-events,google-chrome-extension,indexeddb,Javascript,Html,Javascript Events,Google Chrome Extension,Indexeddb,我正在编写一个chrome扩展,利用它在客户端存储一些信息 数据的性质是,我需要我的用户能够随心所欲地修改对象存储。(添加新对象修改现有对象等)我正在通过设置页面完成这项工作,到目前为止一切都很好 当我想要发布(默认)对象存储的新版本时,需要注意。如果我不在乎覆盖用户的数据,那么我可以像处理新安装时触发的事件一样处理事件。这大概是: var request = window.indexedDB.open(DB_NAME, CURRENT_DB_VERSION); request.onupgrad

我正在编写一个chrome扩展,利用它在客户端存储一些信息

数据的性质是,我需要我的用户能够随心所欲地修改对象存储。(添加新对象修改现有对象等)我正在通过设置页面完成这项工作,到目前为止一切都很好

当我想要发布(默认)对象存储的新版本时,需要注意。如果我不在乎覆盖用户的数据,那么我可以像处理新安装时触发的事件一样处理事件。这大概是:

var request = window.indexedDB.open(DB_NAME, CURRENT_DB_VERSION);
request.onupgradeneeded = upgrade;
function upgrade(event){
  var db = event.target.result;
  var objectStore = db.createObjectStore("domains", {keyPath: "id", autoIncrement: true});
  objectStore.createIndex("domain", "domain", {multiEntry: true });
  for(var i=0; i<tags.length; i++){
    objectStore.add(tags[i]);
    console.log("added " + tags[i]["domain"] + " to the IDBObjectStore 'domains' in the IDBDatabase 'Tags' (Format)");
  }
}
var request=window.indexedDB.open(数据库名称,当前数据库版本);
request.onupgradeneeded=升级;
功能升级(事件){
var db=event.target.result;
var objectStore=db.createObjectStore(“域”{keyPath:“id”,autoIncrement:true});
createIndex(“域”、“域”{multiEntry:true});

对于(var i=0;i您将获得
InvalidStateError
,因为您可能没有调用
IDBDatabase.createObjectStore()
来自
onupgradeneeded
事件处理程序。对于IDB,所有对象存储的创建和操作必须在
onupgradeneeded
事件处理程序内部或触发
onupgradeneeded
后进行

如果我正确理解了您的需求,那么您不希望在某些条件下覆盖用户的现有对象存储,为此,您希望在
onupgradeneeded
事件处理程序中传递一些信息,以告知是重新创建对象存储还是在现有对象存储的基础上进行一些修改

我的建议是-使用两个全局数组变量
DB\u SCHEMA\u DROP\u querys
DB\u SCHEMA\u CREATE\u querys
,在使用
window.indexedDB.open(DB\u NAME,当前的DB\u版本);

然后编写如下代码(我只是简单介绍一下),所以当您想1时。重新创建数据库,然后首先从数据库中删除所有现有数据存储并创建新的(这意味着同时填充
DB\u SCHEMA\u drop\u查询
DB\u SCHEMA\u创建\u查询
).2.只需再添加一个对象存储,然后只准备
DB\u SCHEMA\u CREATE\u查询
3.修改现有对象存储,然后准备
DB\u SCHEMA\u DROP\u查询
DB\u SCHEMA\u CREATE\u查询
,但只准备该特定对象存储

基本上,我们正试图实现的是使事物动态化,而不是像下面这样硬编码数据存储创建
db.createObjectStore(“domains”{keyPath:“id”,autoIncrement:true});
。这也将帮助您摆脱维护版本记录的麻烦

var dropQueriesLength = DB_SCHEMA_DROP_QUERIES.length;
for(var i =0; i < dropQueriesLength; i++){
try{
    DB_HANDLER.deleteObjectStore(DB_SCHEMA_DROP_QUERIES[i].name);
} catch(e){

}
}

for(var i =0; i < DB_SCHEMA_CREATE_QUERIES.length; i++){
  var objectStore = null;
    if(DB_SCHEMA_CREATE_QUERIES[i].primaryKeyCol != null && DB_SCHEMA_CREATE_QUERIES[i].primaryKeyCol != undefined){
        objectStore = DB_HANDLER.createObjectStore(DB_SCHEMA_CREATE_QUERIES[i].name, { keyPath: DB_SCHEMA_CREATE_QUERIES[i].primaryKeyCol});
    }
}
var dropQueriesLength=DB\u SCHEMA\u DROP\u querys.length;
对于(变量i=0;i
触发升级类型事务(版本更改事务)的唯一方法是打开具有更大版本号的连接