Версия базы данных
SQLite 3.7.13
Структура базы данных устройства
Структура базы соответствует модели метаданных решения. В силу того что база sqlite не поддерживает схем, имя объекта и схемы разделяется знаком подчеркивания "_", имя табличной части также отделяется подчеркиванием от имени объекта, например: Document_PriceList, Documet_PriceList_Prices
Запросы к базе данных
Для формирования запросов к базе данных следует использовать объект Query.
Блок кода | ||||
---|---|---|---|---|
| ||||
var q = new Query("SELECT Id, Value FROM Catalog_Outlet_Parameters WHERE Ref=@ref"); q.AddParameter("ref", outlet); var param = q.Execute(); |
В результате будет получен объект Recordset, который можно перебрать в цикле.
Блок кода | ||||
---|---|---|---|---|
| ||||
function ReviseParameters(outlet, save) { var q = new Query("SELECT Id, Value FROM Catalog_Outlet_Parameters WHERE Ref=@ref"); q.AddParameter("ref", outlet); var param = q.Execute(); while (param.Next()) { if (String.IsNullOrEmpty(param.Value)) DB.Delete(param.Id); else{ if (save) param.Id.GetObject().Save(false); } } } |
..или итератором языка разметки экрана
Блок кода | ||||
---|---|---|---|---|
| ||||
function GetOutlets(searchText) { if (String.IsNullOrEmpty(searchText)) { var query = new Query(); query.Text = "SELECT Id, Address, Description FROM Catalog_Outlet ORDER BY Description LIMIT 100"; return query.Execute(); } else { searchText = "'" + searchText + "'"; var query = new Query("SELECT O.Id, T.Outlet, O.Description, O.Address FROM Catalog_Territory_Outlets T JOIN Catalog_Outlet O ON O.Id=T.Outlet WHERE Contains(O.Description, " + searchText + ") ORDER BY O.Description LIMIT 500"); return query.Execute(); } } |
Блок кода | ||||
---|---|---|---|---|
| ||||
<s:Push Id="outlets" Value="$GetOutlets($search)"/> <s:Iterator Id="outlet" Value="$outlets"> <c:VerticalLayout> <c:TextView Text="$outlet.Description" CssClass="main_row"></c:TextView> <c:TextView Text="$outlet.Address" CssClass="description_row"></c:TextView> </c:VerticalLayout> </s:Iterator> |
Перечисления
Перечисления хранятся в таблицах со схемой Enum, работать с ними можно как с обычными таблицами. Но для получения ссылки на конкретное значение перечисления проще использовать конструкцию вида:
Блок кода | ||||
---|---|---|---|---|
| ||||
var status = DB.Current.Constant.VisitStatus.Processing; |
Объект DbRef
Значения полей ссылочных типов представлены в платформе типом DbRef
Метод / Свойство | Описание |
---|---|
[] . | Возвращает значение поля объекта, на которую ссылается объект DbRef |
TableName | Имя типа |
Id | Идентификатор объекта, GUID |
GetObject() | Возвращает объект из кеша. В случае отсутствия в кеше предварительно загружает его с диска |
LoadObject() | Принудительно загружает объект с диска и помещает в кеш |
При выборке из таблицы поля, имеющего ссылочный тип, можно добраться до полей объекта через точку, например:
Блок кода | ||||
---|---|---|---|---|
| ||||
function GetOutletClass() { var query = new Query(); query.Text = "SELECT Id, Address, Class FROM Catalog_Outlet LIMIT 1"; var rst = query.Execute(); if(rst.Next()) return rst.Class.Description; //rst.Class имеет тип Ref else return "not found"; } |
Создание объекта
Для создания объекта следует использовать метод Create объекта DB, передав в него имя:
Блок кода | ||||
---|---|---|---|---|
| ||||
function CreateVisitIfNotExists(outlet, userRef, visit, planVisit) { if (visit == null) { visit = DB.Create("Document.Visit"); if (planVisit != null) visit.Plan = planVisit; visit.Outlet = outlet; visit.SR = userRef; visit.Date = DateTime.Now; visit.StartTime = DateTime.Now; var location = GPS.CurrentLocation; if (location.NotEmpty) { visit.Lattitude = location.Latitude; visit.Longitude = location.Longitude; } visit.Status = DB.Current.Constant.VisitStatus.Processing; visit.Encashment = 0; visit.Save(); //сохраняем объект return visit.Id; //возвращаем ссылку на созданный объект } |
Объект DbObject
При создании нового объекта через DB.Create или получении ссылки на существующий объект через GetObject или LoadObject, платформа возвращает объект DbObject
Метод / Свойство | Описание |
---|---|
[] . | Возвращает значение поля объекта |
IsNew() | Истина для нового, не выгруженного на сервер БИТ:Мобайл объекта |
IsModfied() | Истина если объект был изменен после загрузки из базы |
Save(inTran) | Сохраняет объект в базе данных. Параметр inTran отвечает за сохранение в рамках текущей транзакции. По умолчанию Истина |
Транзакции
По умолчанию все изменения данных происходят в рамках транзакции. Транзакция стартует неявно при вызове метода Save() объекта и отсутствии текущей транзакции. Все последующие изменения объектов будут происходить в текущей транзакции (если только не передан параметр inTran = false в метод Save). Все изменения с момента старта транзакции могут быть зафиксированы в базе данных или отменены с помощью методов Commit() и Rollback() объекта DB соответственно:
Блок кода | ||||
---|---|---|---|---|
| ||||
function CreateVisitIfNotExists(outlet, userRef) { visit = DB.Create("Document.Visit"); visit.Outlet = outlet; visit.SR = userRef; visit.Date = DateTime.Now; visit.StartTime = DateTime.Now; var location = GPS.CurrentLocation; if (location.NotEmpty) { visit.Lattitude = location.Latitude; visit.Longitude = location.Longitude; } visit.Status = DB.Current.Constant.VisitStatus.Processing; visit.Encashment = 0; visit.Save(); //сохраняем объект DB.Commit(); //фиксируем транзакцию } |
Текущая транзакция также фиксируется или откатывается при вызове методов Commit() и Rollback() объекта Workflow
Удаление объекта
Для удаления объекта из базы следует передать ссылку на удаляемый объект в метод Delete() или Delete(inTran) объекта DB. Удаление по умолчанию происходит в рамках текущей транзакции, если не задано обратное в параметре inTran
Custom SQL functions
В платформе реализованы функции, не входящие в спецификацию SQLite:
ToLower(строка) - приводит строку к нижнему регистру
ToUpper(строка) - приводит строку к верхнему регистру
Contains(строка, подстрока) - ищет подстроку в строке, возвращает истину или ложь. Ниже исходный код ф-ии для понимания принципа работы:
Блок кода | ||
---|---|---|
| ||
public static bool Contains(string input, string value) { if (string.IsNullOrEmpty(value)) return true; if (!string.IsNullOrEmpty(input)) { string[] values = value.ToLower().Split(' '); string s = input.ToLower(); for (int i = 0; i < values.Length; i++) if (!s.Contains(values[i])) return false; return true; } else return false; } |
FormatNumber - форматирует число, описание формата см. https://msdn.microsoft.com/ru-ru/library/dwhawy9k(v=vs.110).aspx
FormatDate - форматирует дату, описание формата см. https://msdn.microsoft.com/ru-ru/library/az4se3k1(v=vs.110).aspx
Блок кода | ||||
---|---|---|---|---|
| ||||
SELECT FormatDate(CreationDate, "{0:dd.MM.yyyy}"), FormatNumber(Price, "{0:F2}") FROM Document_SomeDocument |
Пользовательские таблицы
При необходимости платформа позволяет создавать и работать с таблицами, не являющимися частью объектной модели решения. Это может быть полезным для хранения результатов запросов в целях повышения производительности.
Методы DB.CreateTable, DB.DropTable, DB.TruncateTable создают, удаляют и очищают пользовательскую таблицу. Метод Query.ExecuteInto помещает в таблицу результат запроса.
Для выборки данных из пользовательских таблиц следует использовать объект Query. При создании платформа добавляет суффикс UT_ к имени, что следует учесть при написании запроса:
Блок кода | ||||
---|---|---|---|---|
| ||||
function UserTableTest(someGroup) { DB.CreateTable('MyTable', ['Id','Name']); var qry = new Query("SELECT Id, Description FROM Catalog_SKU WHERE Owner = @Owner"); qry.AddParameter("Owner", someGroup); qry.ExecuteInto('MyTable'); var qry = new Query("SELECT Id, Name FROM UT_MyTable") return qry.Execute(); } |
Все операции с пользовательскими таблицами выполняются вне контекста транзакций.;