【问题标题】:IndexedDB error: A mutation operation was attempted on a database that did not allow mutationsIndexedDB 错误:在不允许突变的数据库上尝试了突变操作
【发布时间】:2012-08-29 16:19:58
【问题描述】:
console.log(db); //db object exists
console.log(db.objectStoreNames.contains('test')); //true - object store exists

var transaction = db.transaction(['test'], 'readwrite'); // this line is causing the error

A mutation operation was attempted on a database that did not allow mutations." code: "6

为什么会出现这个错误?我的数据库和对象存储存在吗?我快疯了! :D 非常感谢任何帮助!

谢谢

【问题讨论】:

  • 你用的是什么浏览器?另外,我知道这不是 IndexedDB 世界上最简单的事情,但是如果您可以发布一个展示此问题的独立测试用例,您将有更好的机会获得一个好的答案。

标签: html indexeddb


【解决方案1】:

我现在刚刚在 Mac os x 上的 chrome、safari 上试了试,没有发现错误。

我在http://dev.yathit.com/ydn-db/using/schema.html(页面加载ydn.db.Storage 对象)上执行以下操作

schema = {stores: [{name: 'test'}]}
st = new ydn.db.Storage('test1', schema)
// ... wait for async
db = st.db()
db.transaction(['test'], 'readwrite')

旧 chrome 使用 1 而不是“读写”,但我不认为这是一个原因。

【讨论】:

  • 谢谢,但我发现了错误:在我进行交易之前,我没有等待我的对象存储被创建。
【解决方案2】:

这样的错误太多了。只有这篇文章http://dev.opera.com/articles/introduction-to-indexeddb/说明了原因-- " 使用 IndexedDB,我们数据库上的每个操作或事务都必须在回调函数中发生。"

这是我的简单示例,请使用 chrome 的 devtool->resource->indexedDB 进行检查;(如果 indexedDB 中没有,请尝试刷新浏览器)

html部分:

<form id="form1">
    <label for="task">What do you need to do?</label>
    <input type="text" name="task" id="task" value="" required>
    <button type="submit" id="submit">Save entry</button>
</form>

脚本部分:

var idb = indexedDB.open('niangzi10', 2);
    var dbobject; // Define a global variable to hold our database object
    idb.onsuccess = function (evt) {
        console.log("success");
        if (dbobject === undefined) {
            dbobject = evt.target.result;
        }
    }
    idb.onupgradeneeded = function (evt) {
        dbobject = evt.target.result;
        if (evt.oldVersion < 1) {
            dbobject.createObjectStore('tasks', { autoIncrement: true });
        }
    }
    //transaction operation in callback function
    var form1 = document.getElementById('form1');
    form1.addEventListener('submit', function (evt) {
        'use strict';
        evt.preventDefault();

        var entry = {}, transaction, objectstore, request;
        entry = { name: document.querySelector("#task").value };

        // Open a transaction for writing
        transaction = dbobject.transaction(['tasks'], 'readwrite');
        objectstore = transaction.objectStore('tasks');
        // Save the entry object
        request = objectstore.add(entry);
        transaction.oncomplete = function (evt) {
            alert("'" + document.querySelector("#task").value + "'has been insert into indexedDB;please check it using chrome's devtool->resource->indexedDB(if nothing,refresh browser);");
        };

    });

【讨论】:

    【解决方案3】:

    此错误的一个潜在原因是:Firefox 不支持隐私浏览窗口中的 IndexedDB。请参阅https://bugzilla.mozilla.org/show_bug.cgi?id=1639542 和https://github.com/jakearchibald/idb/issues/81。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      相关资源
      最近更新 更多