Ошибка Была предпринята попытка мутации в базе данных, которая не допускала мутаций. при получении данных в indexedDB

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

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');
    };
  };
};

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

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

онлайн

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

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


person Aleksandr Motsjonov    schedule 04.09.2011    source источник


Ответы (3)


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

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

person cyong    schedule 22.08.2012

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

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

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

person Aleksandr Motsjonov    schedule 06.09.2011
comment
Этот вопрос связан с этим относительно различий между onsuccess и oncomplete - person user1460015; 25.01.2013

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

person Wladimir Palant    schedule 04.09.2011
comment
Спасибо, но это не имеет значения. Я удалил его для простоты. Так что заказчики по объему ничего не меняют. В любом случае, я думаю, что с пустым массивом все в порядке: если этот параметр не указан, пустой или нулевой, то областью транзакции является вся подключенная база данных. - person Aleksandr Motsjonov; 04.09.2011