通过 Dexie 与 IndexedDB 交互所需的步骤

Steps required to interract with IndexedDB via Dexie

假设我使用以下步骤创建了一个非常简单的数据存储:

  1. var db = new Dexie('MyDatabase');

  2. db.version(1).stores({ friends: 'name, age' });

  3. db.friends.add({姓名:'Camilla',年龄:25});

现在,假设用户关闭了他们的浏览器并在一天后回来,我们需要查询我们已经保存在应该已经存在的数据存储中的数据。在查询数据存储或插入新行之前,我是否需要每次都包含第 1 行和第 2 行?我对何时需要执行第 2 行感到困惑 - 基本上是在我对数据存储执行任何操作之前 to/with?

您通常会在每次打开数据库时提供 db.version(x).stores({...}),无论它是需要创建、升级还是刚刚打开。通过提供此信息,您将直接在 db 对象上直接访问您的表(例如访问 db.friends.toArray() 而无需等待 db.open() 完成),如下所示:

var db = new Dexie("friendsDB");
db.version(1).stores({friends: 'id, name'});
// Here you can just access db.friends without waiting for db.open()
db.friends.toArray()
   .then(friends => console.table(friends))
   .catch(err => console.error(err));

但是,也可以动态打开数据库 - 也就是说,在不知道其表或索引的情况下打开现有数据库。为此,您只需省略 version().stores() 部分。请注意,您将无法直接在数据库实例上访问表,并且您不会获得数据库的神奇自动创建。表格需要通过 tables property and table() 方法访问,并且只有在 db.open() 完成后才能访问。

new Dexie("friendsDB").open().then(db => {
    console.log("Table names: " + db.tables.map(t => t.name));
    return db.table("friends").toArray();
}).then(friends => {
    console.table(friends);
}).catch(err => console.error(err));