【问题标题】:using a field with a Boolean type in dexie.js在 dexie.js 中使用布尔类型的字段
【发布时间】:2019-04-03 06:14:20
【问题描述】:

按值选择无效。请告诉我是什么问题?

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.where('done').equals(false).each(function(item) {
    console.log('Found: ' + item.task + ' with date ' + item.dateTime);
});

【问题讨论】:

    标签: javascript dexie


    【解决方案1】:

    布尔值不能在 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)或大量记录,这可能不是一个非常高效的选项。您应该改用索引。

    【讨论】:

      猜你喜欢
      • 2021-06-22
      • 2012-07-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 2018-11-23
      相关资源
      最近更新 更多