如何在IndexedDB中创建多个对象库

use*_*696 7 javascript indexeddb

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

例1

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

例题

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

示例3 - 这应该工作:

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

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

除了使用onupgradeneeded事件处理程序之外,还有其他方法可以创建objectStore.

请帮忙.非常感谢.

编辑:

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

Den*_*ski 15

您需要打开数据库以检查其当前版本并再次打开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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回复。这可行。但对我来说这似乎“愚蠢”,并且不是以编程方式打开数据库两次:/ (3认同)
  • 预先知道版本并非每次都有效,特别是如果数据库可以经常更新(新索引、表),但是在第一次打开时读取数据库版本并将其存储在缓存中可以在需要升级时工作,这样您就可以避免为阅读版本而打开额外的数据库。 (2认同)

Kri*_*ave 5

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

触发onupgradeneeded事件的唯一方法是以比当前版本的数据库更高的版本打开数据库.执行此操作的最佳方法是使用您需要使用的当前版本的数据库保持不变.每次需要更改数据库的架构时,都会增加此数字.然后在onupgradeneeded事件中,您可以检索当前版本的数据库.有了这个,您可以决定需要遵循哪个升级路径来获取最新的数据库模式.

我希望这回答了你的问题.

  • 好的,现在我跟着.我认为Deni的解决方案就是To Go.在没有版本的情况下打开db bydefault并使用递增的版本重新打开它 (2认同)