IndexedDB - логический индекс
Можно ли создать индекс в поле типа Boolean?
Предположим, что схема записей, которые я хочу сохранить:
{
id:1,
name:"Kris",
_dirty:true
}
Я создал обычный не уникальный индекс (onupgradeneeded):
...
store.createIndex("dirty","_dirty",{ unique: false })
...
Индекс создается, но он пуст! - В индексе браузера IndexedDB нет записей с Boolean значениями - только Строки, Числа и Даты или даже Массивы.
Я использую Chrome 25 canary
Мне бы хотелось найти все записи, для которых атрибут _dirty установлен равным true - мне нужно изменить _dirty на string или int then?
Ответы
Ответ 1
Да, boolean не является допустимым ключом.
Если вам нужно, конечно, вы можете решить 1 и 0.
Но это справедливо. Индексирование логического значения не является информативным. В приведенном выше примере вы можете выполнять сканирование таблицы и фильтровать "на лету", а не индексный запрос.
Ответ 2
Ответ, отмеченный как отмеченный, не совсем корректен.
Вы не можете создать индекс для свойства, содержащего значения типа Boolean JavaScript. Эта часть другого ответа верна. Если у вас есть такой объект, как var obj = {isActive: true};
, попытка создания индекса на obj.isActive
не будет работать, и браузер сообщит об ошибке.
Однако вы можете легко имитировать желаемый результат. indexedDB не вставляет свойства, которые отсутствуют в объекте в индекс. Поэтому вы можете определить свойство для представления true, а не определять свойство для представления false. Когда свойство существует, объект появится в индексе. Когда свойство не существует, объект не будет отображаться в индексе.
Пример
Например, предположим, что у вас есть хранилище объектов объектов obj. Предположим, вы хотите создать булевообразный индекс в свойстве isActive
для этих объектов.
Начните с создания индекса в свойстве isActive. В функции обратного вызова onupgradeded используйте store.createIndex('isActive','isActive');
Чтобы представить 'true' для объекта, просто используйте obj.isActive = 1;
. Затем добавьте или поместите объект в хранилище объектов. Если вы хотите запросить все объекты, где установлен isActive
, вы просто используете db.transaction('store').index('isActive').openCursor();
.
Чтобы представить false, просто используйте delete obj.isActive;
, а затем добавьте или или поместите объект в хранилище объектов.
Когда вы запрашиваете для всех объектов, где установлен isActive
, эти объекты, которые не имеют свойства isActive
(поскольку они были удалены или никогда не установлены), не будут отображаться при итерации с помощью курсора.
Voila, булев индекс.
Замечания по производительности
Открытие курсора на индекс, как это было сделано в примере, используемом здесь, обеспечит хорошую производительность. Разница в производительности не заметна с небольшими данными, но она чрезвычайно заметна при хранении большего количества объектов. Нет необходимости принимать некоторую библиотеку третьей стороны для выполнения "логических индексов". Это обычная и простая функция, которую вы можете сделать самостоятельно. Вы должны попробовать как можно больше использовать встроенную функциональность.
Ответ 3
Логические свойства описывают исключительное состояние (активное/неактивное), "Вкл./Выкл.", "Включено/Отключено", "Да/Нет". Вы можете использовать эти пары значений вместо Boolean в модели данных JS для удобства чтения. Также эта тактика позволяет добавлять другие состояния ( "NotSet", для ситуации, если что-то не было настроено в объекте и т.д.)...