布尔值不能在 Dexie 中建立索引。见文档:https://dexie.org/docs/Indexable-Type
以下 javascript 类型可以被索引:
- 字符串
- 号码
- 日期
- 字符串、数字、日期或这些的混合数组。
- ArrayBuffer(仅限 IndexedDB 2.0)
- 类型化数组(仅限 IndexedDB 2.0)
请注意,所有其他类型都是不可索引的,包括:
我目前正在尝试考虑一个好的替代方案,但一个简单的解决方案是使用 0=false 和 1=true 的数字。这样做的好处是您仍然可以依靠数据库的索引来进行查询:
const db = new Dexie('ToDo_DB');
db.version(1).stores({
list: '++id, task, dateTime, done'
});
db.list.clear();
db.list.add({task: "1 task", dateTime: Date.now(), done: 1});
db.list.add({task: "2 task", dateTime: Date.now(), done: 0});
db.list.add({task: "3 task", dateTime: Date.now(), done: 1});
db.list.add({task: "4 task", dateTime: Date.now(), done: 0});
db.list.where('done').equals(0).each(function(item) {
console.log('Found: ' + item.task + ' with date ' + item.dateTime);
});
如果你的存储中没有太多数据并且不需要索引,你可以使用自己的filter()函数,比如:
const db = new Dexie('ToDo_DB');
db.version(1).stores({
list: '++id, task, dateTime, done'
});
db.list.clear();
db.list.add({task: "1 task", dateTime: Date.now(), done: true});
db.list.add({task: "2 task", dateTime: Date.now(), done: false});
db.list.add({task: "3 task", dateTime: Date.now(), done: true});
db.list.add({task: "4 task", dateTime: Date.now(), done: false});
db.list.filter(e => e.done === false).each(function(item) {
console.log('Found: ' + item.task + ' with date ' + item.dateTime);
});
如果您有大型对象(带有 blob)或大量记录,这可能不是一个非常高效的选项。您应该改用索引。