Ошибка «операция мутации была предпринята в базе данных, которая не позволяла мутации». При получении данных в IndexedDB
-
22-10-2019 - |
Вопрос
У меня есть этот простой пример кода:
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
онлайн
var objectStore = transaction.objectStore('customers');
Не могу понять - что мне делать не так?
Решение 2
Я думаю, что нашел ответ. Я не должен получить доступ к объектному магазину внутри 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
Другие советы
Вы можете создать или удалить хранилище объекта только в транзакции обмена версии
видеть: https://developer.mozilla.org/en-us/docs/indexeddb/idbdatabase
Я не пробовал этот кодекс, но судил по документация Вы не должны передавать пустой список в качестве первого параметра db.transaction()
- это должно быть db.transaction(["customers"], ...)
Потому что вы хотите работать с этим магазином объектов.