Error "Se intentó una operación de mutación en una base de datos que no permitía mutaciones". Al recuperar datos en IndexedDB
-
22-10-2019 - |
Pregunta
Tengo este código de ejemplo simple:
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');
};
};
};
Estoy obteniendo esto:
Se intentó una operación de mutación en una base de datos que no permitía mutaciones ". Código:" 6
en línea
var objectStore = transaction.objectStore('customers');
No puedo entender, ¿qué hago mal?
Solución 2
Creo que encontré la respuesta. No debería acceder a ObjectStore dentro de OnComplete. Solo necesito hacerlo después de hacer una nueva transacción. La forma correcta es esta:
var transaction = db.transaction([], IDBTransaction.READ_WRITE, 2000);
transaction.oncomplete = function(){
console.log("Success transaction");
};
var objectStore = transaction.objectStore('customers');
Por cierto, así es como se muestra exactamente el MDN de Mozilla. https://developer.mozilla.org/en/indexeddb/using_indexeddb#section_10
Otros consejos
Puede crear o eliminar un almacén de objetos solo en una transacción de VersionChange
ver: https://developer.mozilla.org/en-us/docs/indexeddb/idbdatabase
No probé ese código, pero a juzgar por la documentación No debe pasar una lista vacía como primer parámetro para db.transaction()
- Debería ser db.transaction(["customers"], ...)
Porque quieres trabajar con esa tienda de objetos.