Dexie.js没有执行.add交易

时间:2015-05-12 05:37:47

标签: javascript database dexie

var db = new Dexie(app.settings.unpublishedBooksDb);
db.version(1).stores({
    friends: "++id,name,shoeSize"
});
db.open();
db.close();

我使用上面的代码创建了一个预创建的indexedDB数据库,然后在应用程序的另一个视图中,我需要在表中添加一行。

var db = new Dexie('myDb');
db.open().then(function() {
    console.log ('opened'); //this works
    db.friends.add({name:"Fredrik"}); //this doesnt do anything and adding a catch doesn't throw an error either
}).finally(function () {
    db.close();
});

我尝试使用.transaction但仍然相同。如果我尝试使用Chrome控制台,则会收到错误消息:无法读取未定义的属性添加

1 个答案:

答案 0 :(得分:0)

您的第二个数据库实例不包含有关它将包含哪些表的信息。所以隐式表属性(db.friends)不存在。实际发生的是它抛出TypeError:无法读取未定义的属性'add'。如果你接到电话(不只是最后做),你就会得到TypeError。

你可以做的是通过db.table('friends')引用friends表.add({name:'Fredrik'})而不是db.friends.add({name:'Fredrik'})。

请注意,虽然在没有指定表模式的情况下定义数据库并不像测试和使用那样彻底,但我建议将其与定义的模式一起使用以避免其他陷阱。如果出于体系结构原因仍然需要按照自己的方式进行操作,请注意事务范围的工作方式稍有不同,因为您无法在事务范围中使用动态隐式故事属性,并且db.table()当前不返回事务限制表实例,如果您在事务范围内。您必须使用旧的事务API:

db.transaction('rw', 'friends', function (friends, trans) {
    friends.put({name: 'Fredrik'});
});

...而不是:

db.transaction('rw', 'friends', function () {
    db.friends.put({name: 'Fredrik'});
});

祝福, 大卫