Шаблоны на основе SQLite

  • URL ревизии: Руководство_по_шаблонам_XUL/Шаблоны_на_основе_SQLite
  • Заголовок ревизии: Шаблоны на основе SQLite
  • ID ревизии: 254203
  • Создано:
  • Автор: Bektur
  • Это текущая версия? Да
  • комментировать Новая: <breadcrumbs></breadcrumbs> Шаблоны могут использовать источник данных, получающий информацию из базы данных Sqlite...

Содержание версии

Шаблоны могут использовать источник данных, получающий информацию из базы данных Sqlite. Это позволяет использовать информацию, полученную из базы данных, для генерации контента XUL. Чтобы сделать это, установите значение атрибута {{ XULAttr("querytype") }} корневого узла шаблона равным storage. Это позволяет рассматривать источник данных как базу данных Sqlite.

Атрибут {{ XULAttr("datasources") }} может быть установленным равным одному из двух возможных типов значений. Во-первых, это может быть URL файла, указывающего на локальный файл. В этом случае, вы, скорее всего, будете устанавливать атрибут datasources динамически, после определения пути к файлу. Во-вторых, вы можете использовать специальную форму url:

profile:filename.sqlite

Эта форма, содержащая префикс 'profile' используется для указания на файлы в директории, содержащей параметры пользователя (profile). Это полезно для хранения пользовательских данных, и применимо в том случае, если вам не нужно вычислять, где находится данная директория. Файл, находящийся в этой директории, указан после двоеточия, и в данном случае это 'filename.sqlite'. Файлы базы данных Sqlite имеют, как правило, расширение 'sqlite'.

Точно также, как и с источниками данных на основе XML, атрибут {{ XULAttr("ref") }} в данное время не используется для источников Sqlite, поэтому вам нужно всего лишь оставить атрибут ref пустым; как правило, для этого используется специальное значение '*'.

Запрос для источника данных Sqlite представляет из себя просто предложение select языка SQL, как текст внутри элемента {{ XULElem("query") }}. Этот простой пример иллюстрирует, как отобразить список, содержащий значения из одной колонки в таблице из базы данных.

<listbox datasources="profile:userdata.sqlite" ref="*" querytype="storage">
  <template>
    <query>
      select name from myfriends
    </query>
    <action>
      <listitem uri="?" label="?name"/>
    </action>
  </template>
</listbox>

Запрос возвращает список значений из колонки 'name' в таблице 'myfriends'. Тело блока action, начинающееся узлом с атрибутом uri="?" повторяется для каждого результата, возвращенного в результате выполнения запроса. Если запрос возвращает шесть результатов, будет создано шесть элементов списка. Атрибут label имеет специальное значение '?name'. Синтаксис, использующий знак вопроса, похож на используемый для других типов запросов. Это обозначает, что каждому атрибуту label будет сопоставлено значение из соответствующей колонки таблицы. В данном случае, значение '?name' обозначает, что необходимо подставить значение из таблицы name. В результате получим список элементов, содержащий имена из базы данных.

Используя более сложные запросы, можно получить значения из нескольких колонок или же данные, выбранные по определённому критерию.

<vbox datasources="profile:userdata.sqlite" ref="*" querytype="storage">
  <template>
    <query>
      select name, email from myfriends where age >= 30
    </query>
    <action>
      <hbox uri="?">
        <label value="?name"/>
        <label value="?email"/>
      </hbox>
    </action>
  </template>
</vbox>

Этот шаблон отображает данные, полученные из двух колонок. Всякое вхождение знака вопроса в блоке action заменяется на значение из результата запроса. В данном случае он используется дважды: в первый раз для отображения имени и во второй раз для отображения адреса электронной почты. Атрибут uri элемента hbox необходим для одного элемента внутри блока action. Для запросов Sqlite в большинстве случаев это будет самый внешний узел.

Обратите внимание также на то, что запрос содержит оператор where, который выбирает только те строки, для которых значение поля возраст не меньше 30.

Параметры запроса

Иногда, вам потребуется динамически изменять запрос в зависимости от определённых критериев. Вы можете использовать простой способ, изменяя текст внутри элемента query, а после перестраивать шаблон. Тем не менее, этот подход может стать громоздким и неповоротливым для более сложных запросов, и может стать источником большого количества ошибок, если для значений не были правильно обработаны специальные символы, такие как лишние кавычки и двоеточия. Это особенно важно, если вы обрабатываете значения, полученные от пользователя.

Простым решением проблемы является использование параметров запросов, используя элемент {{ XULElem("param") }}.

<query>
  select name, email from myfriends where gender == :wantedgender
  <param name="wantedgender">male</param>
</query>

В этом примере используется параметр 'wantedgender'. Прямым потомком элемента query должен быть элемент param. Атрибут name используется для определения имени параметра, а содержимое элемента param определяет используемое значение. Когда имя, предварённое двоеточием, появляется в запросе, такое как ':wantedgender' в вышеприведённом примере, значение этого параметра будет подставлено в запрос. В конечном счёте, используемый запрос выглядит так:

select name, email from myfriends where gender == 'male'

При использовании такого приёма, специальные символы, такие как кавычки, обрабатываются автоматически. Если кавычки появляются в запросе, то они будут при необходимости обработаны. Теперь, чтобы настроить запрос для выбора чего-то иного, например, чтобы выбрать информацию, относящуюся к женщинам, всё что нужно сделать - это просто получить ссылку на элемент param и изменить его содержимое. Скорее всего, вы присвоите определённый идентификатор элементу param, чтобы использовать метод getElementById для доступа к нему.

Вы можете добавить столь много параметров, сколько необходимо для выполнения вашего запроса. Пример, приведённый выше использовал строковый параметр. Тем не менее, если вам нужен числовой параметр, вам также потребуется установить значение атрибута type.

<listbox id="friends" datasources="profile:userdata.sqlite" ref="*" querytype="storage">
  <template>
    <query>
      select name, from myfriends where age >= :minage && age <= maxage
      <param id="minage" name="minage" type="integer">30</param>
      <param id="maxage" name="maxage" type="integer">40</param>
    </query>
    <action>
      <listitem uri="?" label="?name"/>
    </action>
  </template>
</listbox>

В данном случае age - целочисленный параметр, поэтому атрибуту type установлено значение integer. Целые числа представлены 32-битными значениями, но вы можете использовать значение int64 для 64-битных целых. Вы можете также использовать специальное значение double для вещественных чисел с двойной точностью. Если же тип не определён, то по умолчанию предполагается, что он строковый.

Позже мы можем изменить значение параметра age, используя простой скрипт:

function adjustAge(min, max)
{
  document.getElementById("minage").textContent = min;
  document.getElementById("maxage").textContent = max;
  document.getElementById("friends").builder.rebuild();
}

Эта функция принимает два параметра, максимальное и минимальное используемое значения. Мы получаем элементы param и устанавливаем их свойства textContent равными требуемому значению. Наконец, мы перестраиваем весь шаблон.

Revision Source

<p>
</p><p>Шаблоны могут использовать источник данных, получающий информацию из базы данных Sqlite. Это позволяет использовать информацию, полученную из базы данных, для генерации контента XUL. Чтобы сделать это, установите значение атрибута {{ XULAttr("querytype") }} корневого узла шаблона равным <code>storage</code>. Это позволяет рассматривать источник данных как базу данных Sqlite.
</p><p>Атрибут {{ XULAttr("datasources") }} может быть установленным равным одному из двух возможных типов значений. Во-первых, это может быть URL файла, указывающего на локальный файл. В этом случае, вы, скорее всего, будете устанавливать атрибут <code>datasources</code> динамически, после определения пути к файлу. Во-вторых, вы можете использовать специальную форму url:
</p>
<pre>profile:filename.sqlite
</pre>
<p>Эта форма, содержащая префикс 'profile' используется для указания на файлы в директории, содержащей параметры пользователя (profile). Это полезно для хранения пользовательских данных, и применимо в том случае, если вам не нужно вычислять, где находится данная директория. Файл, находящийся в этой директории, указан после двоеточия, и в данном случае это 'filename.sqlite'. Файлы базы данных Sqlite имеют, как правило, расширение 'sqlite'.
</p><p>Точно также, как и с источниками данных на основе XML, атрибут {{ XULAttr("ref") }} в данное время не используется для источников Sqlite, поэтому вам нужно всего лишь оставить атрибут <code>ref</code> пустым; как правило, для этого используется специальное значение '*'. </p><p>Запрос для источника данных Sqlite представляет из себя просто предложение select языка SQL, как текст внутри элемента {{ XULElem("query") }}. Этот простой пример иллюстрирует, как отобразить список, содержащий значения из одной колонки в таблице из базы данных.
</p>
<pre>&lt;listbox datasources="profile:userdata.sqlite" ref="*" querytype="storage"&gt;
  &lt;template&gt;
    &lt;query&gt;
      select name from myfriends
    &lt;/query&gt;
    &lt;action&gt;
      &lt;listitem uri="?" label="?name"/&gt;
    &lt;/action&gt;
  &lt;/template&gt;
&lt;/listbox&gt;
</pre>
<p>Запрос возвращает список значений из колонки 'name' в таблице 'myfriends'. Тело блока action, начинающееся узлом с атрибутом uri="?" повторяется для каждого результата, возвращенного в результате выполнения запроса. Если запрос возвращает шесть результатов, будет создано шесть элементов списка. Атрибут label имеет специальное значение '?name'. Синтаксис, использующий знак вопроса, похож на используемый для других типов запросов. Это обозначает, что каждому атрибуту label будет сопоставлено значение из соответствующей колонки таблицы. В данном случае, значение '?name' обозначает, что необходимо подставить значение из таблицы name. В результате получим список элементов, содержащий имена из базы данных.
</p><p>Используя более сложные запросы, можно получить значения из нескольких колонок или же данные, выбранные по определённому критерию.
</p>
<pre>&lt;vbox datasources="profile:userdata.sqlite" ref="*" querytype="storage"&gt;
  &lt;template&gt;
    &lt;query&gt;
      select name, email from myfriends where age &gt;= 30
    &lt;/query&gt;
    &lt;action&gt;
      &lt;hbox uri="?"&gt;
        &lt;label value="?name"/&gt;
        &lt;label value="?email"/&gt;
      &lt;/hbox&gt;
    &lt;/action&gt;
  &lt;/template&gt;
&lt;/vbox&gt;
</pre>
<p>Этот шаблон отображает данные, полученные из двух колонок. Всякое вхождение знака вопроса в блоке action заменяется на значение из результата запроса. В данном случае он используется дважды: в первый раз для отображения имени и во второй раз для отображения адреса электронной почты. Атрибут <code>uri</code> элемента <code>hbox</code> необходим для одного элемента внутри блока action. Для запросов Sqlite в большинстве случаев это будет самый внешний узел.
</p><p>Обратите внимание также на то, что запрос содержит оператор where, который выбирает только те строки, для которых значение поля возраст не меньше 30.
</p>
<h3 id=".D0.9F.D0.B0.D1.80.D0.B0.D0.BC.D0.B5.D1.82.D1.80.D1.8B_.D0.B7.D0.B0.D0.BF.D1.80.D0.BE.D1.81.D0.B0" name=".D0.9F.D0.B0.D1.80.D0.B0.D0.BC.D0.B5.D1.82.D1.80.D1.8B_.D0.B7.D0.B0.D0.BF.D1.80.D0.BE.D1.81.D0.B0"> Параметры запроса </h3>
<p>Иногда, вам потребуется динамически изменять запрос в зависимости от определённых критериев. Вы можете использовать простой способ, изменяя текст внутри элемента <code>query</code>, а после перестраивать шаблон. Тем не менее, этот подход может стать громоздким и неповоротливым для более сложных запросов, и может стать источником большого количества ошибок, если для значений не были правильно обработаны специальные символы, такие как лишние кавычки и двоеточия. Это особенно важно, если вы обрабатываете значения, полученные от пользователя.
</p><p>Простым решением проблемы является использование параметров запросов, используя элемент {{ XULElem("param") }}.
</p>
<pre>&lt;query&gt;
  select name, email from myfriends where gender == :wantedgender
  &lt;param name="wantedgender"&gt;male&lt;/param&gt;
&lt;/query&gt;
</pre>
<p>В этом примере используется параметр 'wantedgender'. Прямым потомком элемента <code>query</code> должен быть элемент <code>param</code>. Атрибут <code>name</code> используется для определения имени параметра, а содержимое элемента <code>param</code> определяет используемое значение. Когда имя, предварённое двоеточием, появляется в запросе, такое как ':wantedgender' в вышеприведённом примере, значение этого параметра будет подставлено в запрос. В конечном счёте, используемый запрос выглядит так:
</p>
<pre>select name, email from myfriends where gender == 'male'
</pre>
<p>При использовании такого приёма, специальные символы, такие как кавычки, обрабатываются автоматически. Если кавычки появляются в запросе, то они будут при необходимости обработаны. Теперь, чтобы настроить запрос для выбора чего-то иного, например, чтобы выбрать информацию, относящуюся к женщинам, всё что нужно сделать - это просто получить ссылку на элемент <code>param</code> и изменить его содержимое. Скорее всего, вы присвоите определённый идентификатор элементу <code>param</code>, чтобы использовать метод <a href="ru/DOM/document.getElementById">getElementById</a> для доступа к нему.
</p><p>Вы можете добавить столь много параметров, сколько необходимо для выполнения вашего запроса. Пример, приведённый выше использовал строковый параметр. Тем не менее, если вам нужен числовой параметр, вам также потребуется установить значение атрибута <code>type</code>.
</p>
<pre>&lt;listbox id="friends" datasources="profile:userdata.sqlite" ref="*" querytype="storage"&gt;
  &lt;template&gt;
    &lt;query&gt;
      select name, from myfriends where age &gt;= :minage &amp;&amp; age &lt;= maxage
      &lt;param id="minage" name="minage" type="integer"&gt;30&lt;/param&gt;
      &lt;param id="maxage" name="maxage" type="integer"&gt;40&lt;/param&gt;
    &lt;/query&gt;
    &lt;action&gt;
      &lt;listitem uri="?" label="?name"/&gt;
    &lt;/action&gt;
  &lt;/template&gt;
&lt;/listbox&gt;
</pre>
<p>В данном случае age - целочисленный параметр, поэтому атрибуту <code>type</code> установлено значение <code>integer</code>. Целые числа представлены 32-битными значениями, но вы можете использовать значение <code>int64</code> для 64-битных целых. Вы можете также использовать специальное значение <code>double</code> для вещественных чисел с двойной точностью. Если же тип не определён, то по умолчанию предполагается, что он строковый.
</p><p>Позже мы можем изменить значение параметра age, используя простой скрипт:
</p>
<pre>function adjustAge(min, max)
{
  document.getElementById("minage").textContent = min;
  document.getElementById("maxage").textContent = max;
  document.getElementById("friends").builder.rebuild();
}
</pre>
<p>Эта функция принимает два параметра, максимальное и минимальное используемое значения. Мы получаем элементы <code>param</code> и устанавливаем их свойства <a href="ru/DOM/element.textContent">textContent</a> равными требуемому значению. Наконец, мы перестраиваем весь шаблон.
</p>
Вернуть эту версию