HTML5 по крупицам. Часть 2. Web SQL Database. - 9 Июля 2010 - Блог U.S.F. - U.S.F.
Я в твиттере Архив записей Подписаться на обновления

HTML5 по крупицам. Часть 2. Web SQL Database.
09.07.10

Добрейший вечер дорогие мои читатели. Начну пожалуй с собственных мыслей. А именно мыслей касающихся ЮБлогов. Они внезапно вымерли, вместо интресных постов(которые ведь были раньше) пишутся тонны высеров, историй о походе в магазин или прочая чушь. Обидно, что один из очень интересных блоггеров АлматинскийПолубомж перестал писать. А вобщем лента забита всякого рода чушью которая изретка разрежается более-менее полезной информацией. У меня на посты времени в данный момент тоже не много, ибо я прохожу практику и вкалываю как проклятый. Но, к счастью, осталось совсем чуть-чуть, потом заслуженный отдых.

А теперь к делу, во второй части нашего экскурса в HTML5 я расскажу Вам о
 клиентских базах данных, и SQL запросах, работающих с ними. Вообще хочу сказать что разработчики не скудятся на новшества и меня это радует. Теперь станет возможным очень удобно хранить данные на клиенте помимо веб-хранилища. Для начала работы с БД её нужно открывать, делается это с помощью такого кода:

Code
var db = window.openDatabase("Имя БД", "Версия", "Название базы", количество элементов);

Эта понятная конструкция выполняет подключение к БД. Если же такой базы нет, то она создастся. А теперь самое интересное, как же выполнять запросы к базе? Конструкция выглядит так:

Code
db.transaction(function(tx) {
   tx.executeSql("SELECT * FROM таблица", [], successCallback, errorCallback);
   });

Существует метод transaction() (на самом деле есть еще и метод readTransaction(), и отличия у них в том что метод transaction() это чтение/запись, а второй только для чтения), который принимает аргументом функцию. tx является объектом транзакции(это просто переменная). Он имеет метод executeSql, принимающий 4 аргумента. О них чуть подробней:

  1. это собственно сам sql запрос
  2. аргументы. в sql запросе они заменяются на вопросительные знаки "?". К примеру: "INSERT INTO TestTable (id, text) values(?, ?)", ["1", "привет"]. В этом случае первый "?" заменяется на 1, а поторой на "привет". Сделано это из соображений безопасности и еще чего-то, что я не очень разобрал на w3.org)
  3. функция, которая будет вызвана при удачном выполнении sql запроса
  4. функция, вызываемая при возникновении ошибки

Демку можно посмотреть тут. Что же к чему в коде?

Для начала у нас есть данный HTML:

Code
<ul class="record-list" id="db_results"></ul>
<div id="db-log"></div>
<input type="text" id="textdata" />
<button onclick="newRecord()">новый элемент</button>
<button onclick="createTable()">создать таблицу</button>
<button onclick="deleteTable()">удалить таблицу</button>

В "record-list" будут добовляться элементы в таблицу. "db-log" это блок, куда будут выводиться сервисные сообщения. Поле для ввода данных и 3 кнопки: для добовление новой записи "newRecord()", а также для создания и удаления таблицы.  

Code
log=document.getElementById('db-log');</p>

function createTable() {
    dbname=prompt ("Введите имя базы", "db1");
    db.transaction(function(t) {
        t.executeSql("CREATE TABLE "+dbname+" (id REAL UNIQUE, text TEXT)", [],
          function(t) {log.innerHTML = '<p>Вы успешно создали таблицу "'+dbname+'"</p>'; },
          onError
        );
    });
}

Это функция создания новой базы. Имя можно ввести любое(кроме чисел, оно кидает ошибку). t является объектом транзакции. В таблице поля "id" и "text". onError представляет собой обработчик объекта ошибки, выглядит он так:

Code
function onError(t, error){alert(error.message);} 

Далее неплохо было бы уметь что-то добавить в нашу таблицу. Для этого есть функция "newRecord()"

Code
function newRecord() {
    var data=Math.round(Math.random()*1000);
    db.transaction(function(t) {
      t.executeSql("INSERT INTO "+dbname+" (id, text) VALUES (?, ?)", [data, document.querySelector ('#textdata').value], 
        function(t) {log.innerHTML='Данные внесены в таблицу'+dbname; showRecords(); }, 
        onError
      );
    });
}
Мы просто генерируем число от 1 до 1000 и оно является значением поля "id", а данные для поля "text" берем с инпута с помощью нового селектора document.querySelector('#textdata').value

На экран внесенные данные отображаются с помощью функции "showRecords()". Она достаточно интересна и заслуживает разбора:

Code
function showRecords() {
    document.getElementById('db_results').innerHTML = '';
    db.transaction(function(t) {
       t.executeSql("SELECT * FROM "+dbname, [], 
          function(t, result) {
            for(var i=0; i<result.rows.length; i++) {
            item=result.rows.item(i); 
            document.getElementById('db_results').innerHTML+='<span>'+item['text']+'</span><span class="deleteMess"                   onclick="deleteRecord('+item['id']+')"><strong>[Удалить запись]</strong></span></br>';
          }
       })
    });
}

Тут мы видим, что функции обработки передается 2 аргумента. первый- объект транзакции, а второй- это результат выборки. Результат представляет собой набор строк. К строке можно обратиться по индексу "result.rows.item(i);". А к значению можно добраться через имя поля "result.rows.item(i)['text']". В ходе вывода значения также добовляется надпись "Удалить запись" которая удалит значение с текущим "id".

Запись удаляется по "id" такой функцией:

Code
function deleteRecord(id) {
    db.transaction(function(t) {
       t.executeSql("DELETE FROM "+dbname+" WHERE id=?",[id],
         showRecords(),
         onError  
       ) 
    });
}

А для удаление таблицы приготовлено следующее:

Code
function deleteTable() {
    delname=prompt ("Введите имя базы для удаления", "");
    db.transaction(function(t) {
       t.executeSql("DROP TABLE "+delname, [],
          function(t) { log.innerHTML = '<p>Таблица '+delname+' удалена</p>'; showRecords(); }, 
          onError
       );
    });
}

Как видно, мы удаляем таблицу по её имени. В демке  с хотел реализовать через localstorage сохранение созданных таблиц с целью их удобного удаления(чтобы не забыть), но поджимали сроки и я оставил эту затею)

Вообще, тут все интуитивно достаточно понятно, хотя и достаточно сложно виртуализировать таблицу которую не видишь. Надеюсь что Вам это будет интересно.

В следующем посте я напишу о кэш апи, а может и о чем-нибудь еще. Подписывайтесь на рассылку и не пропустите ничего интересного.

Постовой: Пишу о Seo и как заработать в интернете. Способы заработка на сайтах ucoz .

ПОЧИТАТЬ ЕЩЕ:
Теги: html/CSS, html5, JavaScript

1. @KIMMI [10.07.10 в 16:29]
хм... очень интересно ) а где вся эта информация хранится?

2. usf [10.07.10 в 16:48]
у клиента в объекте storage)

/Обидно, что один из очень интересных блоггеров Алматинский Полубомж перестал писать./
Да не перестал он :)
Он просто смотрит чемпионат мира по футболу :)

4. usf [12.07.10 в 10:25]
ну вижу что уже активизировался))
а чемп окончился(( обидно, я за Голландию болел с самого начала..

Я перед началом ЧМ предсказал что Испания выиграет.
Но в финале тоже за Голландию болел.

6. usf [12.07.10 в 12:38]
я за испанию болел только в матче против германии, так как не люблю эту сборную...а Голландию жаль было очень((

Имя *:
Email:
Ваш сайт:
Хотите что-то сказать?
Код *:

Хостинг от uCoz