Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

Версия базы данных

SQLite 3.7.13

Структура базы данных устройства

Структура базы соответствует модели метаданных решения. В силу того что база sqlite не поддерживает схем, имя объекта и схемы разделяется знаком подчеркивания "_", имя табличной части также отделяется подчеркиванием от имени объекта, например: Document_PriceList, Documet_PriceList_Prices

Запросы к базе данных

Для формирования запросов к базе данных следует использовать объект Query.

Блок кода
languagejs
themeEclipse
var q = new Query("SELECT Id, Value FROM Catalog_Outlet_Parameters WHERE Ref=@ref");
q.AddParameter("ref", outlet);
var param = q.Execute();

В результате будет получен объект Recordset, который можно перебрать в цикле.

 

Блок кода
languagejs
themeEclipse
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);
		} 
	}
}

..или итератором языка разметки экрана

Блок кода
languagejs
themeEclipse
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();
	}
}


Блок кода
languagexml
themeEclipse
<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, работать с ними можно как с обычными таблицами. Но для получения ссылки на конкретное значение перечисления проще использовать конструкцию вида:

Блок кода
languagejs
themeEclipse
var status = DB.Current.Constant.VisitStatus.Processing;

Объект DbRef

Значения полей ссылочных типов представлены в платформе типом DbRef

Метод / СвойствоОписание
[] .Возвращает значение поля объекта, на которую ссылается объект DbRef
TableNameИмя типа
IdИдентификатор объекта, GUID
GetObject()Возвращает объект из кеша. В случае отсутствия в кеше предварительно загружает его с диска
LoadObject()Принудительно загружает объект с диска и помещает в кеш

 

При выборке из таблицы поля, имеющего ссылочный тип, можно добраться до полей объекта через точку, например:

Блок кода
languagejs
themeEclipse
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";
}

 

Следует избегать подобных конструкций в цикле. Каждое такое обращение заставляет платформу выполнить отдельный запрос к базе. И хотя результаты подобных запросов кешируются, это может сказаться на производительности. Лучше использовать запрос с JOIN к связанной таблице.

Создание объекта

Для создания объекта следует использовать метод Create объекта DB, передав в него имя:

Блок кода
languagejs
themeEclipse
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 соответственно:

Блок кода
languagejs
themeEclipse
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(строка, подстрока) - ищет подстроку в строке, возвращает истину или ложь. Ниже исходный код ф-ии для понимания принципа работы:

Блок кода
languagec#
	    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

Блок кода
languagesql
themeEclipse
SELECT FormatDate(CreationDate, "{0:dd.MM.yyyy}"), FormatNumber(Price, "{0:F2}") FROM Document_SomeDocument

Пользовательские таблицы

При необходимости платформа позволяет создавать и работать с таблицами, не являющимися частью объектной модели решения. Это может быть полезным для хранения результатов запросов в целях повышения производительности.

Методы DB.CreateTable, DB.DropTable, DB.TruncateTable создают, удаляют и очищают пользовательскую таблицу. Метод Query.ExecuteInto помещает в таблицу результат запроса.

Для выборки данных из пользовательских таблиц следует использовать объект Query. При создании платформа добавляет суффикс UT_ к имени, что следует учесть при написании запроса:

Блок кода
languagejs
themeEclipse
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();
}

Все операции с пользовательскими таблицами выполняются вне контекста транзакций.;