использование поля с логическим типом в dexie.js - PullRequest
0 голосов
/ 30 октября 2018

Не работает, выберите по значению 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: 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);
});

1 Ответ

0 голосов
/ 19 июня 2019

Булевы нельзя индексировать в Dexie. Смотрите документацию: https://dexie.org/docs/Indexable-Type

Возможны следующие типы javascript для индексации:

  • строка
  • номер
  • Дата
  • Массивы строк, чисел, дат или их сочетаний.
  • ArrayBuffer (только IndexedDB 2.0)
  • Типизированные массивы (только IndexedDB 2.0)

Обратите внимание, что все другие типы не индексируются, в том числе:

  • булево
  • не определено
  • Object
  • 1032 * нуль *

В данный момент я пытаюсь найти хорошую альтернативу этому, но простым решением будет использование числа с 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);
});

Если у вас есть большие объекты (с каплями) или много записей, это, вероятно, не очень эффективный вариант. Вместо этого вы должны использовать индекс.

...