Javascript 在Safari Mobile(iOS8.1)/Safari Desktop上重新打开具有版本更改的objectstore

Javascript 在Safari Mobile(iOS8.1)/Safari Desktop上重新打开具有版本更改的objectstore,javascript,safari,indexeddb,ios8.1,Javascript,Safari,Indexeddb,Ios8.1,TL;DR我想打开一个数据库,从中获取一些信息,关闭它,然后根据我从中获取的信息(版本、对象存储区数量等)使用升级参数重新打开它 我写的indexeddb插件有一些问题,我关闭了一个对象存储,然后用版本更改重新打开它 但首先,我要了解一下我到底在做什么。由于这个原因,我不得不为我的数据库做一个非常难看的结构。基本上,我发现当你插入更多的记录时,插入的速度会变慢。因为我有一组非常大的数据需要保存,所以将每个数据块保存到单独的Objectstore中要快得多。起初,我为每个objectstore创建

TL;DR我想打开一个数据库,从中获取一些信息,关闭它,然后根据我从中获取的信息(版本、对象存储区数量等)使用升级参数重新打开它

我写的indexeddb插件有一些问题,我关闭了一个对象存储,然后用版本更改重新打开它

但首先,我要了解一下我到底在做什么。由于这个原因,我不得不为我的数据库做一个非常难看的结构。基本上,我发现当你插入更多的记录时,插入的速度会变慢。因为我有一组非常大的数据需要保存,所以将每个数据块保存到单独的Objectstore中要快得多。起初,我为每个objectstore创建了一个新的数据库。这很好,但随着我对indexedDB的理解越来越深入,我意识到这不是最好的方法。我将插件从使用多个数据库切换到使用多个objectstores的一个数据库。然而,这就是我的问题开始的地方

由于我无法知道需要多少数据块,每个数据块需要一个objectstore,因此我首先从服务器获取将插入的记录总数,然后将其除以每个数据块的大小。这样我就知道我需要多少ObjectStore。但是,由于我需要同步这些数据,这些ObjectStore可能已经存在,也可能不存在

正因为如此,我得到了已经存在的ObjectStore的数量,如果这个数量少于我添加的部分的数量,我会添加更多

为了获得那个数量的对象存储,我需要首先打开数据库,然后使用更新的模式信息再次打开它。然而,当我尝试这样做时,它总是在我的onupgradeneed中点击我的abort函数。但是,如果我只是从页面加载运行create函数,而不是首先打开数据库,它似乎可以很好地更新数据库模式(但这对我并没有帮助,因为我需要知道我有多少表和当前的数据库版本,然后才能更新任何内容)

这在chrome、firefox和android上的chrome上运行良好,但在iOS或Safari上则不行。看起来像是WebKit的问题,但我一直在挖掘他们的错误追踪器,没有发现任何类似的问题

我认为它没有正确地关闭以前的数据库连接,因此无法打开新的数据库连接,但我在这里可能是错的。以前是否有人遇到过这种情况,或者对我如何解决它有什么想法

如果有帮助,以下是我的一些代码:

$.ajax({
        type: 'POST',
        url: "website/myURL.json",
        success: function(data){
            partCount = data;
            console.log("Got " + partCount + " parts.");

            $().database.get(timeTable,{"success":function(obj){
                tables = obj;
                if(tables.length < partCount){//Build new tables
                    var newTables = [];
                    var version = ($().database.version() + 1);

                    for(var i=tables.length; i<partCount; i++){
                        newTables.push({name:"table_"+i});
                    }
                    $().database.close();
                    $().database.open("database", 
                        {   version: version,
                            tables: newTables,
                            success: function(){
                                callbackFunction();
                            }
                        }
                    );
                }
                else{
                    callbackFunction();
                }
            }});
$.ajax({
键入:“POST”,
url:“website/myURL.json”,
成功:功能(数据){
零件计数=数据;
log(“Got”+partCount+“parts.”);
$().database.get(时间表,{“success”:函数(obj){
表=obj;
if(tables.length    function open(options){
        var opts = $.extend({
            version: settings.version,
            name: settings.name,
            keyPath: settings.keyPath
        },options);

        _dbExists = true;
        _logging = opts.logging;

        database.indexedDB = {};
        database.indexedDB.db = null;

        var request;
        if(opts.version === null || opts.version === ""){
            request = indexedDB.open(opts.name);
        }
        else{
            request = indexedDB.open(opts.name, opts.version);
        }

        request.onupgradeneeded = function(e) {
            var db = request.result;
            db.onabort = function (es) {
                console.log("DB action aborted.");
                opts.abort(es);
            };

            if(opts.tables){
                for(var j=0; j<opts.tables.length; j++){
                    table = opts.tables[j];

                    if(db.objectStoreNames.contains(table.name)){
                        db.deleteObjectStore(table.name);
                    }
                    //Create object store for each table.
                    var key = (table.hasOwnProperty("keyPath") && table.keyPath != null) ? table.keyPath : opts.keyPath; 
                    var objectStore = db.createObjectStore(table.name, {keyPath: key});
                    if(table.indices){
                        for(var i=0; i<table.indices.length; i++){
                            //Add indecies to table.
                            objectStore.createIndex(table.indices[i].name, table.indices[i].keyPath, table.indices[i].param);
                        }
                    }
                }
            }
            if(_logging) console.log("Upgrading database.");
        };

        request.onsuccess = function(e){
            database.indexedDB.db = request.result;
            _version = parseInt(request.result.version);
            console.log("DB opened");
            if(opts.success != null){
                opts.success(e);
            }
        };

        request.onerror = function(e) {
            console.log(e);
            if(opts.error != null){
                opts.error(e);
            }
        };
    }