javascript - Safari:IndexedDB:无法在单独的事务中创建对象存储

标签 javascript safari indexeddb

Safari 和 iPhone 网络浏览器似乎无法允许用户从单独的事务创建不同的对象存储。甚至当用户关闭数据库、增加版本号然后在 onupgradedneeded 回调中使用 createObjectStore() 时也是如此。

有解决办法吗?

例如访问http://bl.ocks.org/redgeoff/1dea140c52397d963377在 Safari 中,当 Safari 尝试创建第二个对象存储时,您将收到带有“AbortError”的警报。

为方便起见,这里是相同的代码片段:

var idb = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB
          || window.msIndexedDB;

// Generate a unique db name as IndexedDB is very delicate and we want our test
// to focus on a new DB
var dbName = 'mydb' + '_' + (new Date()).getTime() + '_'
             + Math.round(1000000*Math.random());

var db = null;

var version = 1;

var open = function (version, onSuccess, onUpgradeNeeded) {

  var request = null;
  if (version) {
    request = idb.open(dbName, version);
  } else { // 1st time opening?
    request = idb.open(dbName);
  }

  request.onupgradeneeded = function () {
    if (onUpgradeNeeded) {
      onUpgradeNeeded(request);
    }
  };

  request.onsuccess = function () {
    db = request.result;
    if (onSuccess) {
      onSuccess(request);
    }
  };

  request.onerror = function () {
    console.log('error=', request.error);
    alert('error=' + JSON.stringify(request.error));
  };
};

var createObjectStore = function (name, callback) {
  db.close(); // synchronous
  version++; // increment version to trigger onupgradeneeded
  open(version, callback, function (request) {
    request.result.createObjectStore(name, {
      keyPath: 'id'
    });
  });
};

// NOTE: we could create the first store when opening the DB for the first time, but we'll keep
// things simple and reuse our createObjectStore code for both object stores
open(null, function () {
  createObjectStore('store1', function () {
    createObjectStore('store2', function () {
      console.log('done creating both stores');
    });
  });
});

我尝试在数据库关闭并重新打开后休眠 2 秒,但这似乎不起作用。如果没有解决方法,那么这实际上意味着您不能在 Safari 中使用 IndexedDB 实现来动态创建对象存储,这意味着您需要在创建 DB 之前了解所有对象存储。

最佳答案

除非我弄错了并且有人有变通方法,否则动态添加对象存储的最佳方法是实现一个 db-per-object-store 设计。换句话说,只要您需要创建新的对象存储,就应该创建一个新的数据库。

另一个不错的选择是使用 https://github.com/axemclion/IndexedDBShim用 WebSQL 模拟 IndexedDB。

关于javascript - Safari:IndexedDB:无法在单独的事务中创建对象存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34124846/

相关文章:

javascript - 使用indexedDB返回 'undefined'

javascript - 递归 JQuery 以在文本中格式化 HTML 节点值

javascript - Wordpress Cron Job 调用 javascript 函数提交 Web 表单

javascript - 透明 Canvas 视频 Safari 问题

mobile - 在 Safari 中滚动时元素消失 - -webkit-transform 修复仅在第一次时有效

html - Safari 翻译(%,%) 别名

javascript - 当用户尝试删除 indexedDB 数据库时,有没有办法执行函数?

Javascript - 如何获取单击的按钮的 ID

html - 水平滚动 div 在 Safari 中不起作用

javascript - Dexie/IndexedDB 移动隐私浏览错误 - 呃哦 : Missing API Error: IndexedDB API Not Available