Javascript 在Safari Mobile(iOS8.1)/Safari Desktop上重新打开具有版本更改的objectstore
TL;DR我想打开一个数据库,从中获取一些信息,关闭它,然后根据我从中获取的信息(版本、对象存储区数量等)使用升级参数重新打开它 我写的indexeddb插件有一些问题,我关闭了一个对象存储,然后用版本更改重新打开它 但首先,我要了解一下我到底在做什么。由于这个原因,我不得不为我的数据库做一个非常难看的结构。基本上,我发现当你插入更多的记录时,插入的速度会变慢。因为我有一组非常大的数据需要保存,所以将每个数据块保存到单独的Objectstore中要快得多。起初,我为每个objectstore创建了一个新的数据库。这很好,但随着我对indexedDB的理解越来越深入,我意识到这不是最好的方法。我将插件从使用多个数据库切换到使用多个objectstores的一个数据库。然而,这就是我的问题开始的地方 由于我无法知道需要多少数据块,每个数据块需要一个objectstore,因此我首先从服务器获取将插入的记录总数,然后将其除以每个数据块的大小。这样我就知道我需要多少ObjectStore。但是,由于我需要同步这些数据,这些ObjectStore可能已经存在,也可能不存在 正因为如此,我得到了已经存在的ObjectStore的数量,如果这个数量少于我添加的部分的数量,我会添加更多 为了获得那个数量的对象存储,我需要首先打开数据库,然后使用更新的模式信息再次打开它。然而,当我尝试这样做时,它总是在我的onupgradeneed中点击我的abort函数。但是,如果我只是从页面加载运行create函数,而不是首先打开数据库,它似乎可以很好地更新数据库模式(但这对我并没有帮助,因为我需要知道我有多少表和当前的数据库版本,然后才能更新任何内容) 这在chrome、firefox和android上的chrome上运行良好,但在iOS或Safari上则不行。看起来像是WebKit的问题,但我一直在挖掘他们的错误追踪器,没有发现任何类似的问题 我认为它没有正确地关闭以前的数据库连接,因此无法打开新的数据库连接,但我在这里可能是错的。以前是否有人遇到过这种情况,或者对我如何解决它有什么想法 如果有帮助,以下是我的一些代码:Javascript 在Safari Mobile(iOS8.1)/Safari Desktop上重新打开具有版本更改的objectstore,javascript,safari,indexeddb,ios8.1,Javascript,Safari,Indexeddb,Ios8.1,TL;DR我想打开一个数据库,从中获取一些信息,关闭它,然后根据我从中获取的信息(版本、对象存储区数量等)使用升级参数重新打开它 我写的indexeddb插件有一些问题,我关闭了一个对象存储,然后用版本更改重新打开它 但首先,我要了解一下我到底在做什么。由于这个原因,我不得不为我的数据库做一个非常难看的结构。基本上,我发现当你插入更多的记录时,插入的速度会变慢。因为我有一组非常大的数据需要保存,所以将每个数据块保存到单独的Objectstore中要快得多。起初,我为每个objectstore创建
$.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);
}
};
}