Курсоры

Курсоры.

Курсоры представляют собой альтернативный способ извлечения данных и поиска по группе объектов, которая была возвращена базой данных в одной транзакции. Курсор получает определенный список объектов из хранилища объектов и создает указатель, с помощью которого одновременно можно обратиться только к одному объекту в списке.

В API индексированных баз данных для создания курсора используется метод openCursor(). Он извлекает информацию из выбранного хранилища объектов и возвращает объект IDBCursor, предлагающий собственные атрибуты и методы для манипулирования курсором:

— continue(). Перемещает указатель курсора на одну позицию вперед, одновременно на курсоре срабатывает событие success. Когда указатель достигает конца списка, событие success также срабатывает, однако в этот раз возвращается пустой объект. Указатель можно переместить в произвольную позицию списка, передав методу значение индекса (указывается в скобках);

— delete() . Удаляет объект в текущей позиции курсора;

— update(value). Аналогичен методу put(), однако обновляет значение объекта в текущей позиции курсора.

У метода openCursor() также есть атрибуты для указания типа возвращаемых объектов и их порядка. Со значениями по умолчанию он возвращает все доступные объекты в выбранном хранилище объектов, упорядочивая их по возрастанию. Подробнее об этом поговорим чуть позже.

Листинг 11.9. Список объектов

Function initiate(){

Databox=document. getElementById(‘databox’); var button=document. getElementById(‘save’); button. addEventListener(‘click’, addobject, false); if(‘webkitIndexedDB’ in window){

Window. indexedDB=window. webkitIndexedDB;

Window. IDBTransaction=window. webkitIDBTransaction;

Window. IDBKeyRange=window. webkitIDBKeyRange;

Window. IDBCursor=window. webkitIDBCursor;

}else if(‘mozIndexedDB’ in window){ window. indexedDB=window. mozIndexedDB;

}

Var request=indexedDB. open(‘mydatabase’); request. addEventListener(‘error’, showerror, false); request. addEventListener(‘success’, start, false);

}

Function showerror(e){

Alert(‘Ошибка: ‘+e. code+’ ‘+e. message);

}

Function start(e){

Db=e. result || e. target. result; if(db. version==»){

Var request=db. setVersion(‘1.0’);

Request. addEventListener(‘error’, showerror, false); request. addEventListener(‘success’, createdb, false);

}else{

Show();

}

}

Function createdb(){

Var objectstore=db. createObjectStore(‘movies’,{keyPath: ‘id’}); objectstore. createIndex(‘SearchYear’, ‘date’,{unique: false});

}

Function addobject(){

Var keyword=document. getElementById(‘keyword’).value;

Var title=document. getElementById(‘text’).value; var year=document. getElementById(‘year’).value; var transaction=db. transaction([‘movies’], IDBTransaction. READ_WRITE); var objectstore=transaction. objectStore(‘movies’); var request=objectstore. add({id: keyword, name: title, date: year}); request. addEventListener(‘success’, show, false); document. getElementById(‘keyword’).value=»; document. getElementById(‘text’).value=»; document. getElementById(‘year’).value=»;

}

Function show(){

Databox. innerHTML=»;

Var transaction=db. transaction([‘movies’]); var objectstore=transaction. objectStore(‘movies’); var newcursor=objectstore. openCursor(); newcursor. addEventListener(‘success’, showlist, false);

}

Function showlist(e){

Var cursor=e. result || e. target. result; if(cursor){

Databox. innerHTML+='<div>’+cursor. value. id+’ — ‘+

Cursor. value. name+’ — ‘+cursor. value. date+'</div>’; cursor. continue();

}

}

Window. addEventListener(‘load’, initiate, false);

В листинге 11.9 представлен полный JavaScript-код, необходимый для знакомства с этим примером. Из всех функций, применяемых для конфигурирования базы данных, немного изменилась только start(). Теперь, если версия базы данных отличается от null (то есть база данных была создана ранее), вызывается функция show(). Она выполняет всю работу по отображению списка объектов из хранилища объектов. Таким образом, если база данных уже существует, то, как только веб-страница загрузится, вы увидите список объектов в поле справа на экране.

Самые большие изменения в этом коде произошли в функциях show() и showlist(). Здесь мы впервые используем курсоры.

Даже если мы считываем информацию из базы данных с помощью курсора, это все равно нужно делать в пределах транзакции. Поэтому в функции show() мы первым делом создаем разрешающую только чтение (тип READ_ONLY) транзакцию для хранилища объектов movies. Именно это хранилище объектов привязывается к транзакции, после чего мы открываем для данного хранилища курсор, применяя для этого метод openCursor().

Если операция завершается успешно, то возвращается объект, содержащий всю полученную из хранилища информацию, на этом объекте срабатывает событие success и вызывается функция showlist().

У объекта, возвращаемого операцией, есть несколько атрибутов, позволяющих читать информацию:

— key. Возвращает значение ключа объекта в текущей позиции курсора; О value. Возвращает значение любого свойства объекта в текущей позиции курсора. Имя свойства необходимо указать как свойство атрибута, например value. year;

— direction. Объекты можно считывать в порядке по возрастанию или по убыванию. Этот атрибут возвращает текущее условие сортировки; О count. Возвращает приблизительное количество объектов в курсоре.

В функции showlist() в листинге 11.9 есть условный оператор if. С помощью этого оператора мы проверяем содержимое курсора. Если никакие объекты возвращены не были, а также если указатель достиг конца списка, объект оказывается пустым и цикл завершается. Однако если указатель указывает на допустимый объект, то информация выводится на экран, а указатель с помощью метода continue() переводится на одну позицию вперед.

Важно запомнить, что необходимости в использовании цикла while здесь нет, так как метод continue() снова вызывает событие success и вся функция целиком выполняется еще раз. Так продолжается до тех пор, пока курсор не возвращает значение null, — в этом случае continue() больше не вызывается.

Код из листинга 11.9 заменяет собой все предыдущие примеры кода JavaScript. Очистите файл indexed. js и скопируйте в него этот новый код. Откройте шаблон из листинга 11.1 и, если вы еще этого не сделали, добавьте в базу данных информацию обо всех фильмах, перечисленных в начале главы.

Вы будете видеть полный список уже сохраненных в базе фильмов в поле справа на экране. Данные будут упорядочиваться по возрастанию значения свойства id.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *