Хранение данных
• 207
Также вы видите, что я разделил значение времени на 1000. Время в JavaScript определя-
ется с точностью до миллисекунд, тогда как SQLite понимает только целые секунды. Нам
это понадобится дальше, для отображения сообщений, созданных не более пяти минут
назад. Даты мы сохраняем как целые числа. Для метода
getTime
в JavaScript одна секунда
соответствует значению 1000, а для SQLite одна секунда — это 1. Следовательно, мы делим
значение на 1000, чтобы записать секунды, а не миллисекунды.
Наконец, когда пользователь щелкает переключатель, мы вызываем функцию
show
, пере-
давая ей время в качестве аргумента:
var tweetEl = document.getElementById('tweets');
function show(amount) {
db.transaction(function (tx) {
tx.executeSql('SELECT * FROM tweets' + (amount !=
¬ 'all' ? ' WHERE date > strftime(
"%s",
"now",
"-' +
¬ amount + ' minutes")' : ''), [], function
¬ (tx, results) {
var html = [],
len = results.rows.length;
for (var i = 0; i < len; i++) {
html.push('
' + results.rows.item(i).text +
¬ '');
}
tweetEl.innerHTML = html.join('');
} );
});
}
На первый взгляд код может выглядеть слишком сложно, но в действительности там всего
пара вещей, на которые стоит обратить внимание:
1) запуск новой транзакции;
2) исполнение единственного оператора SQL, структура которого определяется тем, хотите
вы получить все или нет;
3) просмотр результатов и составление кода HTML, который потом помещается в
tweetEl
(элемент
)
innerHTML
.
У нас может быть два варианта запроса SQL:
SELECT * FROM tweets
или
SELECT * FROM tweets WHERE date > strftime("%s", "now",
¬ "-5 minutes")
Я указал –5 минут, но в действительности это может быть –30 минут или любое другое
значение, переданное функции
show
. Функция SQLite
strftime
генерирует число секунд,
прошедшее с 1 января 1970 года до текущего момента минус
N
минут. Так как поле даты
у нас целочисленное, это позволяет извлечь все сообщения, написанные в течение по-
следних
N
минут.