我有两个db。我想清空DB,添加新的内容。我正在使用以下方法。
function updateDB(db, dbInstance, newElements) {
return dbInstance.forEach(function(oldElement) {
dbInstance.remove(oldElement);
}).then(function() {
console.log('Deleted all rows');
return db.saveChanges(function() {
dbInstance.addMany(newElements);
return db.saveChanges(function(){
console.log('Added '+newElements.length+' rows');
return true;
});
});
});
}
从技术上讲,我调用了上述方法2次。例如return updateDB(db1, db1.dbIns1, newElements1).then(function() {
return updateDB(db2, db2.dbIns2, newElements2).then(function() {
return true;
});
});
方法的定义如下:这是在加载和onready方法被调用时完成的:
$data.Entity.extend("Db1Name", {
Id: { type: "string", key: true},
Name: { type: "string"},
Values : {type: "string"}
});
$data.EntityContext.extend("db1Test", {
db1Ins: { type: $data.EntitySet, elementType: Db1Name }
});
var db1 = new db1Test({ name: "indexedDb", databaseName: "db1Ins" });
在Firefox中执行此操作时,当执行db.saveChanges()不止一次时,我得到InvalidStateError: A mutation operation was attempted on a database that did not allow mutations.
。这是代码问题吗?
你的名字是误导,当你调用db1是一个实例,db1Ins是一个实体集,Db1Name是一个实体类型。在函数中,参数名也是坏的:db是一个上下文,dbInstance是一个实体集。我建议你用好听的名字。
我不喜欢混合回调和承诺链,所以让我们重写它:
function updateDB(ctx, set, newElements) {
return set.toArray()
.then(function(oldElements) {
oldElements.forEach(function(oldElement) {
set.remove(oldElement);
};
console.log('Deleted all rows');
return ctx.saveChanges();
})
.then(function() {
set.addMany(newElements);
return ctx.saveChanges();
})
.then(function(l){
console.log('Added '+l+' rows');
return true;
});
}