如何在IndexedDB中创建多个对象存储

问题描述 投票:0回答:3

我不知道我是对还是错。但据我所知,我无法手动创建版本更改事务。调用此功能的唯一方法是在打开索引数据库连接时更改版本号。如果这是正确的,那么在 example1 和 example2 中将永远不会创建新的 objectStore?

示例1

function createObjectStore(name){
    var request2 = indexedDB.open("existingDB");    
    request2.onupgradeneeded = function() {
        var db = request2.result;   
        var store = db.createObjectStore(name); 
    };
}

示例2

function createObjectStore(name){
    var request2 = indexedDB.open("existingDB");    
    request2.onsuccess = function() {
        var db = request2.result;   
        var store = db.createObjectStore(name); 
    };
 }

示例 3 - 这应该有效:

function createObjectStore(name){
    var request2 = indexedDB.open("existingDB", 2);     
    request2.onupgradeneeded = function() {
        var db = request2.result;   
        var store = db.createObjectStore(name); 
    };
}

如果我想在一个数据库中创建多个objectStore如何在打开数据库之前获取/获取数据库版本? 那么有没有办法自动化获取数据库版本号的过程??

除了使用 onupgradeneeded 事件处理程序之外,还有其他方法来创建 objectStore 吗?

请帮忙。非常感谢。

编辑:

这是我遇到的同样的问题: https://groups.google.com/a/chromium.org/forum/#!topic/chromium-html5/0rfvwVdSlAs

javascript indexeddb
3个回答
24
投票

您需要打开数据库检查其当前版本,然后使用

version + 1
再次打开数据库以触发升级。

这是示例代码:

function CreateObjectStore(dbName, storeName) {
    var request = indexedDB.open(dbName);
    request.onsuccess = function (e){
        var database = e.target.result;
        var version =  parseInt(database.version);
        database.close();
        var secondRequest = indexedDB.open(dbName, version+1);
        secondRequest.onupgradeneeded = function (e) {
            var database = e.target.result;
            var objectStore = database.createObjectStore(storeName, {
                keyPath: 'id'
            });
        };
        secondRequest.onsuccess = function (e) {
            e.target.result.close();
        }
    }
}

5
投票

创建对象存储的唯一方法是在 onupgradeneeded 事件中。您需要一个 version_change 事务才能更改架构。获取 version_change 交易的唯一方法是通过 onupgradeneeded 事件。

触发 onupgradeneeded 事件的唯一方法是使用比当前数据库版本更高的版本打开数据库。做到这一点的最佳方法是与您需要使用的数据库的当前版本保持一致。每次需要更改数据库架构时,都会增加此数字。然后在onupgradeneeded事件中,您可以检索数据库的当前版本。这样,您就可以决定需要遵循哪个升级路径才能获得最新的数据库架构。

我希望这能回答您的问题。


0
投票

接受的答案是错误的或已弃用。这是我让它发挥作用的方法。抱歉,糟糕的设计必然导致糟糕的代码:

getStore(name: string): Promise<IDBObjectStore> {

let dbRequest = indexedDB.open("hydraLocalDatabase", 1);
let store: IDBObjectStore;
let promise = new Promise<IDBObjectStore>((resolve, reject) => {

  dbRequest.onsuccess = (e2) => {
    let dbRequest2 = <IDBOpenDBRequest>e2.target;
    let db2 = dbRequest2.result;
    let version = db2.version;

    db2.close();
    dbRequest2 = indexedDB.open("hydraLocalDatabase", version + 1);

    dbRequest2.onupgradeneeded = (e3) => {
      let dbRequest3 = <IDBOpenDBRequest>e3.target;
      let db3 = dbRequest3.result;
      let transaction: IDBTransaction;

      if (!db3.objectStoreNames.contains(name)) {
        try {
          store = db3.createObjectStore(name, { keyPath: 'id' });
          transaction = dbRequest3.transaction;

          transaction.oncomplete = (e4) => {
            try {
              var transaction4 = db3.transaction([name], 'readwrite');
              store = transaction4.objectStore(name);
            }
            catch (e) {
              this.logger.fatal(e);
              reject(e);
            }

            resolve(store);
          }
        }
        catch (e) {
          this.logger.fatal(e);
          reject(e);
        }
      }
    }

    dbRequest2.onerror = (e) => {
      reject(e);
    }
  }

  dbRequest.onerror = (e) => {
    reject(e);
  }
});

return promise;

}

© www.soinside.com 2019 - 2024. All rights reserved.