9

I have this simple example code:

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

I am getting this:

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

on line

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

Can't figure out - what do I do wrong?

3 Answers 3

7

You can create or delete an object store only in a versionchange transaction

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

0
5

I think I found the answer. I shouldn't access objectStore inside oncomplete. I just need to do it after making new transaction. Right way is this:

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

Btw, this is how exactly Mozilla's MDN shows. https://developer.mozilla.org/en/IndexedDB/Using_IndexedDB#section_10

1
  • This question is related to this regarding the differences between onsuccess and oncomplete Commented Jan 25, 2013 at 16:57
0

I didn't try that code but judging by the documentation you shouldn't pass an empty list as first parameter to db.transaction() - it should rather be db.transaction(["customers"], ...) because you want to work with that object store.

2
  • 2
    Thanks, but It doesn't metter. I removed it for simplicity. So "customers" in scope doesn't change anything. Anyway, I think empty array is ok: "If this parameter is unspecified, empty, or null, then the scope of the transaction is the entire connected database." Commented Sep 4, 2011 at 19:24
  • When I pass an empty array I get the error: "IDBDatabase.transaction: Empty scope passed in"
    – tumelo
    Commented Sep 12, 2023 at 3:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.