Сохранение истории во внешней базе данных
Иногда необходимо сохранить историю переменных во внешей базе данных. Вот несколько шагов, позволяющих осуществить это: установите желаемую базу данных с таблицей для хранения значений, подключите эту базу данных к SberMobile Server и создайте Модель, которая будет слушать изменения переменных и хранить их в этой таблице.
1. Установка внешней базы данных
Мы не будем описывать аспекты управления базой данных, предполагая, что вы с этим знакомы. |
Сначала нужно получить базу данных. Можно создать новую базу данных или использовать существующую. Предположим, что имя базы данных - historyDB
. Затем необходимо создать таблицу, которая будет сохранять историю переменных. Пусть у таблицы будет имя variable_history
и следующие поля:
Имя | Тип | Цель |
id | BIGINT | Используется для хранения идентификатора событий изменения переменных. Должен быть типом "число", может содержать длинные значения. |
name | CHAR/VARCHAR | Содержит имя пепременной. |
time | TIME/TIMESTAMP | Время изменения переменной. |
value | FLOAT/DOUBLE | Само значение переменной. |
Предлагаются все типы полей, нужно определить соответствующий тип базы данных для каждого поля в соответствии с его целью. |
2. Подключение к внешней базе данных
Теперь давайте подключим базу данных к SberMobile Server. Для этого нужно создать для нее учетную запись устройства. Откройте всплывающее меню для узла Device
в System Tree
и кликните по пункту Add Device
.
В диалоге Add Device
выберите
как Device Driver
. Должны появиться следующие поля:
Введите Name
и Description
для учетной записи устройства, как показано выше. Затем правильно заполните Database URL
, эта строка подключения JDBC должна указывать на вашу базу данных. Строка подключения зависит от вашей DBMS. Можно начать редактирование строки, используя один из шаблонов в комбинированной ячейке поля. Для большинства современных баз данных можно пропустить поле Driver Class
. Введите учетные данные Username
и Password
базы данных и нажмите OK
. Если параметры верны и соединение установлено, в системе появится учетная запись устройства History Database
и отобразится ее диалог Device Properties
:
Теперь перейдите во вкладку Queries
и добавьте новую запись путем нажатия кнопки Add Row
(). Заполните все поля, как показано выше. После сохранения изменений при помощи кнопки OK
наше устройство History Database
получает настройку variableHistory
, которая показывает содержание таблицы variable_history
. Вы можете посмотреть значение variableHistory
в окне настроек устройства. Оно открывается двойным щелчком по узлу устройства или путем выбора пункта Manage Device
во всплывающем меню.
После создания и установки устройства можно взаимодействовать с базой данных, выполняя запросы для учетной записи устройства History Database
.
3. Создание модели для извлечения данных
Мы будем использовать модель для прослушивания изменений переменных и записывать данные о событиях в базу данных. Поэтому нужно создать Модель. Откройте всплывающее меню для узла Models
и выберите пункт Create
, подобный созданию Device Account
. Введите Name
и Description
в диалоге Properties
, как показано ниже, и нажмите OK
:
Откроется диалог Configuration
. Перейдите во вкладку Bindings
и нажмите кнопку Add Row
(). К таблице Привязки будет добавлена новая привязка. Теперь нужно настроить поля привязки:
Установите ее поля On Startup
, On Event
и Periodically
, как показано выше.
Цель
Оставьте это поле пустым. Мы не хотим добавлять данные события к любой цели. Вместо этого мы просто выполняем запрос обновления базы данных в поле Expression
.
Активатор
Сделаем так, чтобы наша привязка прослушивала событие изменения переменных. Щелкните по кнопке [...]
поля
. В открывшемся диалоге Activator
откройте Event tab
, затем локализуйте желаемое устройство для прослушивания и дважды щелкните на событии Context variable changed
. Внизу должна появиться ссылка на это событие, например: users.admin.devices.demoVirtualDevice:updated@
. Теперь сохраните изменения путем нажатия кнопки OK
.
После этого наша привязка будет выполняться каждый раз при изменении любых переменных в Demo Device
. Для расчета нашей привязки по конкретным изменениям нужно задать условие.
Условие
Условие будет проверять каждое событие изменения переменных. Когда условие false
, событие будет игнорироваться. Поэтому нужно настроить выражение условия на cell({env/value}, 'variable') == 'random'
. Это означает, что выражение привязки будет рассчитываться, только когда событие изменения переменных принадлежит переменной random
в Demo Device
.
Выражение
Выражение рассчитывается каждый раз при вызове привязки и выполнении условия. Откройте Редактор выражений этого поля путем щелчка по кнопке [...]
. В открывшемся диалоге Expression Editor
задайте выражение для выполнения запроса обновления базы данных. Он выполняется путем вызова функции executeQuery
нашей учетной записи устройства History Database
. Запрос добавит новую запись к таблице variable_history
.
Мы будем использовать функцию языка выражений callFunction(String context, String function, Object parameter1, Object parameter2, ...)
для вызова функции executeQuery
устройства (1) History Database
. Можно найти шаблон этой функции в диалоге, который открывается кнопкой (2) Functions
. Параметры следующие:
context
- путь строки к контексту, откуда вызывается функция. Можно локализовать устройствоHistory Database
в дереве (3)Server Data
, затем открыть всплывающее меню в соответствующем узле и выбрать действиеCopy
. После этого можно вставить путь устройства в текст выражения. Поэтому путь к устойствуHistory Database
должен бытьusers.admin.devices.historyDatabase
(4)function
- имя вызывающей функции. Оно должно бытьexecuteQuery
(5). Эта функция принадлежит базе данных SQLHistory Database
context.parameter1 (query)
- первый параметр вызывающей функции. Для вызывающей функцииexecuteQuery
это строка запроса. Поэтому наш запрос должен быть следующий:insert into variable_history(id, name, time, value) values(..., ..., ..., ...)
. Реальные значения должны быть введены вместо'...'
. Мы получаем реальные значения из среды выражения. В нашем случае он будет хранить параметры события измененной переменной, потому что мы настраиваем эту привязку для расчета при событии.{env/id}
ссылается на идентификатор события.cell({env/value}, "variable")
получает имя переменной из данных событий.formatDate({env/time}, "YYYY-MM-dd HH:MM:s.SS")
берет форматы и время событий в приемлемую временную строку базы данных .cell(cell({env/value}, "value"), "value")
получает измененное значение из данных событий, берет таблицу, которая является измененной переменнойvalue
и получает полеvalue
значения переменной (6).parameter2 (update)
- второй параметрexecuteQuery
указывает, является ли этот запрос запросом обновления. В нашем случае этоtrue
, т.е. запрос должен возвращать любое значение (7).
Примените выражение путем нажатия кнопки OK
и нажмите кнопку OK
в предыдущем диалоге Model Configuration
для сохранения наших изменений привязок в модели.
Теперь, если все сделано правильно, изменения переменной Demo Device's random
начнут сохраняться в таблице value_history
базы данных historyDB
.
Можно проверить, если ли ошибки выполнения привязки, просматривая относящиеся к модели события |
4. Просмотр результатов
Наконец, вы можете изучить свои результаты, открывая настройки History Database
. Дважды щелкните на узле History Database
в System Tree
. Настройка Variable History
должна содержать примерно следующие данные: