О локальных базах данных SQL

Adobe AIR 1.0 и более поздних версий

Краткое разъяснение и примеры кодов с использованием баз данных SQL см. в следующих статьях по быстрому началу работы в центре Adobe Developer Connection:

Adobe AIR включает в себя механизм реляционной базы данных на основе SQL, который работает в среде выполнения, а данные хранятся в файлах базы данных на локальном компьютере, на котором выполняется приложение AIR (например, на жестком диске компьютера). За счет локального выполнения базы данных и локального хранения файлов данных приложение AIR может использовать базу данных независимо от наличия сетевого подключения. Таким образом, механизм локальной базы данных SQL среды выполнения обеспечивает удобство хранения постоянных локальных данных приложения, особенно если у вас есть опыт работы с реляционными базами данных и базами данных SQL.

Применение локальных бах данных SQL

Функция локальной базы данных SQL в AIR может использоваться в любых целях, имеющих отношение к хранению данных приложения на локальном компьютере пользователя. Adobe AIR включает в себя несколько механизмов для локального хранения данных, каждый из которых имеет свои плюсы. Ниже приводятся возможные случаи использования локальной базы данных SQL в приложении AIR:

  • В приложении для работы с данными (например, адресная книга) база данных может использоваться для хранения данных главного приложения.

  • В приложении для работы с документами, с помощью которого пользователи создают документы для сохранения и, возможно, общего доступа, каждый документ можно сохранить в виде файла базы данных в местоположении, указанном пользователем. (Но обратите внимание, что, если база данных не зашифрована, любое приложение AIR сможет открыть файл этой базы данных. Шифрование рекомендуется для наиболее важных документов.)

  • В приложении для работы по сети база данных может использоваться для хранения локального кэша данных приложения или для временного хранения данных, когда сетевое подключение недоступно. Можно создать механизм для синхронизации локальной базы данных с сетевым хранилищем данных.

  • В любом приложении база данных может использоваться для хранения настроек приложения отдельных пользователей, например параметров пользователя или сведений о приложении, таких как размер и расположение окна.

О базах данных AIR и файлах баз данных

Каждая отдельная локальная база данных SQL в Adobe AIR хранится в виде одного файла в файловой системе компьютера. Среда выполнения включает в себя механизм базы данных SQL, который управляет созданием и структурированием файлов базы данных, а также операциями с данными и извлечением данных из файла базы данных. Среда выполнения не указывает на то, как и где хранятся данные базы данных в файловой системе; каждая база данных полностью хранится в одном файле. Вы сами задаете местоположение в файловой системе для хранения файла базы данных. Одно приложение AIR может обращаться к одной или нескольким отдельным базам данных (т. е. к отдельным файлам баз данных). Поскольку среда выполнения хранит каждую базу данных в отдельном файле в файловой системе, базу данных можно найти в соответствии с заданной для приложения процедурой и ограничениями операционной системы на доступ к файлам. Каждый пользователь может иметь свой файл базы данных, либо к файлу базы данных могут обращаться все пользователи приложения с одного компьютера с общими данными. Поскольку данные являются локальными для каждого компьютера, пользователи с разных компьютеров не имеют автоматического общего доступа к этим данным. Механизм локальной базы данных SQL не имеет функции выполнения инструкций SQL в отношении удаленных или серверных баз данных.

О реляционных базах данных

Реляционная база данных представляет собой механизм для хранения (и извлечения) данных на компьютере. Данные упорядочены в таблицы: в строках представлены записи или элементы, а столбцы (иногда называемые полями) разделяют отдельные значения каждой записи. Например, в приложении «адресная книга» может быть таблица «Друзья». В этом случае каждая строка таблицы будет представлять отдельного друга, информация о котором хранится в базе данных. Столбцы таблицы будут содержать такие сведения, как имя, фамилия, дата рождения и т. д. Для каждой строки, представляющей друга, в базе данных хранится отдельное значение каждого столбца.

Реляционные базы данных предназначены для хранения сложных данных, когда один элемент связан с элементами другого типа. В реляционной базе данных любые данные со связью «одна-с-несколькими» — когда одна запись связана с несколькими записями другого типа — делятся между различными таблицами. Например, вы хотите, чтобы в адресной книге хранилось несколько телефонных номеров каждого друга — это и есть связь «одна-с-несколькими». Таблица «друзья» будет содержать все личные данные о каждом друге. Другая таблица «Телефоны» будет содержать все телефонные номера всех друзей.

Помимо хранения данных о друзьях и телефонных номеров каждой таблице потребуются данные для отслеживания взаимосвязи между двумя таблицами, т. е. для поиска соответствия между отдельными записями о друзьях и номерами их телефонов. Такие данные называются первичным ключом — это уникальный идентификатор, благодаря которому каждая строка таблицы отличается от другой. Первичный ключ может быть «естественным», т. е. представлять собой один из элементов данных, который является естественным отличительным признаком каждой записи в таблице. В таблице «Друзья», если вы знаете, что ни у одного из друзей не совпадает дата рождения, можно использовать столбец даты рождения в качестве первичного ключа (естественного ключа) этой таблицы. Если естественный ключ отсутствует, создается отдельный столбец первичного ключа, например «Идентификатор друга» — искусственно созданное значение, используемое приложением для различения строк.

При помощи первичного ключа можно устанавливать связи между несколькими таблицами. Предположим, в таблице «Друзья» есть столбец «Идентификатор друга», который содержит уникальный номер для каждой строки (каждого друга). Связанная с ней таблица «Телефонные номера» может состоять из двух столбцов: один — с идентификатором друга, которому принадлежит этот телефонный номер, второй — с самим телефонным номером. Таким образом, независимо от количества телефонных номеров одного пользователя, все они могут храниться в таблице «Телефонные номера» и быть связанными с соответствующим другом при помощи первичного ключа «Идентификатор друга». Когда первичный ключ одной таблицы используется в связанной таблице для указания на связь между записями, значение связанной таблицы называется внешним ключом. В отличие от многих баз данных механизм локальной базы данных AIR не позволяет создавать ограничения внешнего ключа для автоматической проверки наличия соответствующей строки в таблице первичного ключа при вставке или обновлении внешнего ключа. Тем не менее связи с внешними ключами являются важной частью структуры реляционной базы данных, и внешние ключи необходимо использовать при создании связей между таблицами базы данных.

О языке SQL

Язык структурированных запросов (SQL) используется в реляционных базах данных для выполнения операций над данными и извлечения данных. SQL скорее является описательным языком, чем процедурным. Вместо того, чтобы предписывать компьютеру способ извлечения данных, инструкция SQL описывает набор необходимых вам данных. Механизм базы данных определяет способ извлечения этих данных.

Язык SQL был стандартизирован Американским национальным институтом стандартов (ANSI). Локальная база данных SQL в Adobe AIR поддерживает большую часть стандарта SQL-92.

Конкретные описания языка SQL, поддерживаемого в Adobe AIR, см. в разделе « Поддержка SQL в локальных базах данных ».

О классах базы данных SQL

Для работы с локальными базами данных SQL в ActionScript 3.0 используются экземпляры этих классов, входящие в пакет flash.data:

Класс

Описание

flash.data.SQLConnection

Позволяет создавать и открывать базы данных (файлы баз данных), а также содержит методы для выполнения операций на уровне базы данных и для управления транзакциями базы данных.

flash.data.SQLStatement

Представляет собой одну инструкцию SQL (один запрос или одну команду), выполняющуюся в отношении базы данных, включая определение текста инструкции и задание значений параметров.

flash.data.SQLResult

Позволяет получать информацию о выполнении инструкции и ее результатах, например строки результата инструкции SELECT , количество строк, задействованных в инструкции UPDATE или DELETE , и т. д.

Чтобы получить данные о схеме, описывающей структуру базы данных, используются эти классы из пакета flash.data:

Класс

Описание

flash.data.SQLSchemaResult

Служит контейнером для результатов схемы базы данных, полученных вызовом метода SQLConnection.loadSchema() .

flash.data.SQLTableSchema

Предоставляет описание отдельной таблицы базы данных.

flash.data.SQLViewSchema

Предоставляет описание отдельного представления базы данных.

flash.data.SQLIndexSchema

Предоставляет описание отдельного столбца таблицы или представления базы данных.

flash.data.SQLTriggerSchema

Предоставляет описание отдельного триггера базы данных.

Другие классы пакета flash.data содержат константы, которые используются с классом SQLConnection и классом SQLColumnSchema:

Класс

Описание

flash.data.SQLMode

Определяет набор констант, представляющих возможные значения параметра openMode методов SQLConnection.open() и SQLConnection.openAsync() .

flash.data.SQLColumnNameStyle

Определяет набор констант, представляющих возможные значения свойства SQLConnection.columnNameStyle .

flash.data.SQLTransactionLockType

Определяет набор констант, представляющих возможные значения параметра option метода SQLConnection.begin() .

flash.data.SQLCollationType

Определяет набор констант, представляющих возможные значения свойства SQLColumnSchema.defaultCollationType и параметра defaultCollationType конструктора SQLColumnSchema() .

Кроме того, следующие классы пакета flash.events представляют используемые события (и соответствующие константы):

Класс

Описание

flash.events.SQLEvent

Определяет события, отправляемые экземпляром SQLConnection или SQLStatement при успешном выполнении какой-либо из его операций. Каждой операции соответствует константа типа события, определенная в классе SQLEvent.

flash.events.SQLErrorEvent

Определяет событие, отправляемое экземпляром SQLConnection или SQLStatement в случае возникновения ошибки во время выполнения какой-либо из его операций.

flash.events.SQLUpdateEvent

Определяет событие, отправляемое экземплярами SQLConnection при изменении данных таблицы в одной из подключенных баз данных в результате выполнения инструкции SQL INSERT , UPDATE или DELETE .

Наконец, следующие классы пакета flash.errors предоставляют сведения об ошибках в работе базы данных:

Класс

Описание

flash.errors.SQLError

Предоставляет сведения об ошибке в работе базы данных, включая данные об операции, которая выполнялась, и причине сбоя.

flash.errors.SQLErrorOperation

Определяет набор констант, представляющих возможные значения свойства operation класса SQLError, указывающего на операцию базы данных, во время выполнения которой произошла ошибка.

О режимах синхронного и асинхронного выполнения

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

В режиме асинхронного выполнения вы передаете среде выполнения инструкцию, и среда выполнения отправляет событие при успешном или неудачном завершении запрошенной вами операции. Сначала вы предписываете механизму базы данных выполнить операцию. Механизм базы данных работает в фоновом режиме, а приложение продолжает выполняться. Наконец, по завершении операции (или сбое) механизм базы данных отправляет событие. Написанный код, инициированный этим событием, выполняет последующие операции. Такой подход имеет существенное преимущество: среда выполнения выполняет операции базы данных в фоновом режиме, тогда как код главного приложения продолжает выполняться. Если операция базы данных требует значительного количества времени, приложение продолжает выполняться. Что самое важное, пользователь может продолжать взаимодействие с приложением без «застывания» экрана. Тем не менее, код асинхронной операции сложнее написать, чем другой код. Сложность возникает в случаях, когда несколько зависимых операций должны распределяться среди различных методов прослушивателей событий.

Концептуально, проще кодировать операции как единую последовательность шагов, т. е. набор синхронных операций, а не как набор операций, разделенных на несколько методов прослушивателей событий. Помимо асинхронных операций базы данных Adobe AIR также позволяет выполнять операции базы данных синхронно. В синхронном режиме операции выполняются не в фоновом режиме. Вместо этого они выполняются в той же последовательности, что и другой код приложения. Вы предписываете механизму базы данных выполнить операцию. На этом этапе код приостанавливает выполнение на время работы механизма базы данных. По завершении операции выполнение продолжается со следующей строки кода.

Асинхронное или синхронное выполнение операций задается на уровне SQLConnection. При использовании одного подключения базы данных невозможно выполнять одни операции или инструкции синхронно, а другие асинхронно. Задание синхронного или асинхронного режима выполнения для SQLConnection осуществляется путем вызова метода SQLConnection для открытия базы данных. При вызове SQLConnection.open() подключение использует синхронный режим выполнения, а при вызове SQLConnection.openAsync() используется асинхронный режим выполнения. Как только экземпляр SQLConnection подключается к базе данных при помощи метода open() или openAsync() , для него устанавливается синхронный или асинхронный режим выполнения, пока подключение к базе данных не будет прервано и установлено заново.

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