0
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 的控制台,我会收到一个错误:无法读取未定义的属性添加

4

1 回答 1

0

您的第二个数据库实例不包含有关它将包含哪些表的信息。所以隐式表属性(db.friends)不存在。实际发生的是它抛出 TypeError: cannot read property 'add' of undefined。如果你会接听电话(不只是做一个 finally),你会得到那个 TypeError 被捕捉到。

您可以做的是通过 db.table('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'});
});

最好的祝愿,大卫

于 2015-05-13T10:12:15.347 回答