Reputation: 14072
I have the following code, which throws a InvalidStateError
in Firefox (when calling objectStore
).
The message is A mutation operation was attempted on a database that did not allow mutations.
.
Strangely, when I place the creation of the transaction inside the getBlob
callback it seems to work.
function saveFile( fileEntry ) {
var transaction = this;
transaction.onerror = function( event ) {
console.log( event );
};
fileEntry.getBlob( "", function( blob ) {
var store = transaction.objectStore( STORE_NAME );
try {
var request = store.put( blob, fileEntry.getFullname() );
request.onsuccess = function( event ) {
console.log( "file: " + fileEntry.getFullname() );
++(progressBar[0].value);
};
request.onerror = function( event ) {
console.log( "error in file " + event );
++(progressBar[0].value);
};
} catch( ex ) {
console.log("getBlob " + ex );
}
}, function() {
}, true );
}
function saveRecursive( dirEntry, missingFiles ) {
var db = this;
var transaction = db.transaction( [STORE_NAME],
MODES.READ_WRITE );
for( var i in dirEntry.children ) {
var entry = dirEntry.children[i];
if( entry.directory ) {
createDirectory( dirEntry, entry );
saveRecursive.call( db, entry, missingFiles );
continue;
}
var index = missingFiles.indexOf( entry.getFullname() );
if( index == -1 )
continue;
// Still missing - add
missingFiles.splice( index, 1 );
saveFile.call( transaction, entry );
}
}
Could someone explain to me, why this is not working?
Upvotes: 2
Views: 2722
Reputation: 13141
If getBlob is async function, this will not work:
fileEntry.getBlob( "", function( blob ) {
var store = transaction.objectStore( STORE_NAME );
because transaction
is already committed, when you get the blob.
Upvotes: 1