Ошибка «Операция мутации была предпринята в базе данных, которая не допускала мутации». при получении данных в indexedDB - PullRequest
5 голосов
/ 04 сентября 2011

У меня есть простой пример кода:

var request = mozIndexedDB.open('MyTestDatabase');
request.onsuccess = function(event){
  var db = event.target.result;
  var request = db.setVersion('1.0');
  request.onsuccess = function(event){
    console.log("Success version.");
    if(!db.objectStoreNames.contains('customers')){
      console.log("Creating objectStore");
      db.createObjectStore('customers', {keyPath: 'ssn'});
    }
    var transaction = db.transaction([],  IDBTransaction.READ_WRITE, 2000);
    transaction.oncomplete = function(){
      console.log("Success transaction");
      var objectStore = transaction.objectStore('customers');
    };
  };
};

Я получаю это:

Была предпринята операция мутации в базе данных, которая не допускала мутации."6

on line

var objectStore = transaction.objectStore('customers');

Не могу понять - что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 06 сентября 2011

Я думаю, что нашел ответ.Я не должен получить доступ к objectStore внутри oncomplete.Мне просто нужно сделать это после совершения новой транзакции.Правильный путь таков:

var transaction = db.transaction([],  IDBTransaction.READ_WRITE, 2000);
    transaction.oncomplete = function(){
      console.log("Success transaction");
    };
var objectStore = transaction.objectStore('customers');

Кстати, именно так показывает MDN Mozillahttps://developer.mozilla.org/en/IndexedDB/Using_IndexedDB#section_10

3 голосов
/ 22 августа 2012

Вы можете создать или удалить хранилище объектов только в транзакции изменения версии

см .: https://developer.mozilla.org/en-US/docs/IndexedDB/IDBDatabase

0 голосов
/ 04 сентября 2011

Я не пробовал этот код, но, судя по документации , вы не должны передавать пустой список в качестве первого параметра db.transaction() - скорее, это будет db.transaction(["customers"], ...), потому что вы хотите работать схранилище этого объекта.

...