Javascript Dexie.js未执行。添加事务

Javascript Dexie.js未执行。添加事务,javascript,database,dexie,Javascript,Database,Dexie,我有一个使用上述代码预创建的indexedDB数据库,然后在应用程序的另一个视图上,我需要向表中添加一行 var db = new Dexie(app.settings.unpublishedBooksDb); db.version(1).stores({ friends: "++id,name,shoeSize" }); db.open(); db.close(); 我试着使用.transaction,但还是一样。如果我尝试使用Chrome的控制台,我会得到一个错误:无法读取未定义的

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

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

我试着使用
.transaction
,但还是一样。如果我尝试使用Chrome的控制台,我会得到一个错误:无法读取未定义的属性add

您的第二个db实例不包含关于它将包含哪些表的信息。因此隐式表属性(db.friends)不存在。实际发生的是,它抛出TypeError:无法读取未定义的属性“add”。如果你想抓住这个电话(而不是仅仅做一个finally),你就会抓住这个TypeError

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

尽管在定义数据库时没有指定表模式并没有经过严格的测试和使用,但请注意,因此我建议将其与定义的模式一起使用,以避免其他陷阱。如果出于体系结构原因仍需要按自己的方式执行,请注意,事务作用域的工作方式略有不同,因为您也不能在事务作用域中使用动态隐式属性,并且如果您在事务作用域中,db.table()当前不会返回事务绑定表实例。您必须使用旧的事务API:

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();
});
…而不是:

db.transaction('rw', 'friends', function (friends, trans) {
    friends.put({name: 'Fredrik'});
});
致以最良好的祝愿,
大卫

谢谢你,大卫,这就行了!我只需要创建自己的方法,在每次需要时定义相同的模式后打开db,除非有其他好的理由(我不是说不可能),我建议在单个位置定义db,并始终使用相同的实例。即使它在一个已经打开的数据库上定义了模式,但这并不有害——它不会尝试重新创建索引——它会发现数据库是否已创建,并且只在需要时创建表和索引。如果使用多个db实例,请确保在完成后关闭它们。否则,您的数据库连接可能会阻止另一个数据库升级或被删除。
db.transaction('rw', 'friends', function () {
    db.friends.put({name: 'Fredrik'});
});