Здравствуйте ценители (и не только) Flash, Flex и AIR.
Сегодня я расскажу как работать с локальной базой данных (SQLite) в AIR приложениях.
Для работы нам понадобится Flex Builder, какой-нибудь, редактор SQLite (я использую приложение для FireFox SQLite Manager) и немного терпения.
Редактор нам нужен для просмотра изменений в файле базы, поскольку AIR не имеет собственного.
Для реализации задуманного нам понадобятся следующие библиотеки:
- import flash.data.SQLConnection; // Необходима для соединения с файлом базы данных (БД)
- import flash.data.SQLStatement; // Необходима для работы с запросами
- import flash.data.SQLResult; // Необходима для обработки результатов запроса
- import flash.data.SQLMode; // Нам не понадобится, а используется для пояснения, для чего мы открываем БД (чтения, записи или обновления)
-
- import flash.events.SQLErrorEvent; // Обрабатывает ошибки подсоединения к БД
- import flash.events.SQLEvent; // Обрабатывает остальные события БД (OPEN, UPDATE и т.д.)
-
- import flash.filesystem.File; // Необходима для указания пути к файлу БД
* This source code was highlighted with Source Code Highlighter.
Как и другие среды работающие с БД SQLite AIR может создавать свои файлы, а может работать уже с готовыми файлами БД.
Рассмотрим вариант с созданием файла БД с нуля.
Для начала нам нужно создать сам файл базы (testDB.sqlite) для этого используем следующую конструкцию:
- var dbFile:File = File.desktopDirectory.resolvePath("testDB.sqlite"); // Указываем путь к файлу БД (В нашем случае это рабочий стол)
-
- var DBConnection:SQLConnection = new SQLConnection(); // Коннектимся к базе
- DBConnection.addEventListener(SQLErrorEvent.ERROR, DBError); // Добавляем обработчик события возникающего при соединении
- DBConnection.addEventListener(SQLEvent.OPEN, DBOpen); // Добавляем обработчик события возникающего при удачном соединении
- DBConnection.open(dbFile); // Собственно инициализируем открытие базы
-
- /**
- * Эта функция обрабатывает ошибки соединения
- */
- private function DBError(e:SQLErrorEvent):void
- {
- trace("Error message: ", e.error.message);
- trace("Details: ", e.error.details);
- }
-
- /**
- * Эта функция обрабатывает удачное соединение
- */
- private function DBOpen(e:SQLEvent):void
- {
- trace("The database was created successfully");
- }
* This source code was highlighted with Source Code Highlighter.
Файл БД у нас уже есть осталось только заполнить его таблицами. Создание таблиц можно привязать к событию успешного создания БД (DBOpen). Далее, мы так и поступим, а пока разберемся из чего будет состоять наша БД (на примере базы которая будут хранить дни рождения). Она будет состоять из двух таблиц:
1. groups — группы в которые будут входить люди, н.п. «Друзья», «Работа», «Семья». В таблице будет два поля (id, name);
2. и собственно peoples с полями (id, lname, fname, ffname, date, group_id)
Теперь создадим, описанные выше, таблицы для этого нам понадобится переменная которая будет содержать запрос к базе:
- var GroupsTable:String = "CREATE TABLE IF NOT EXISTS groups (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT)";
* This source code was highlighted with Source Code Highlighter.
И объект для управления запросами (этот код можно вставить в функцию DBOpen):
- var statement:SQLStatement = new SQLStatement(); // Создаем объект
- statement.sqlConnection = DBConnection; // Указываем базу по отношению к которой будем выполнять запрос
- statement.text = GroupsTable; // Указываем текст запроса
- statement.addEventListener(SQLErrorEvent.ERROR, DBError); // Добавляем обработчик события возникающего при соединении
- statement.addEventListener(SQLEvent.RESULT, TableResult); // Добавляем обработчик события возникающего при успешном создании таблицы
- statement.execute(); // Инициализируем обработку запроса
-
- /**
- * Эта функция обрабатывает удачное создание таблицы
- */
- private function TableResult(e:SQLEvent):void
- {
- trace("Table created");
- }
* This source code was highlighted with Source Code Highlighter.
Теперь создаем вторую таблицу, по аналогии:
- var PeoplesTable:String = "CREATE TABLE peoples (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, lname TEXT, fname TEXT, ffname TEXT, date TEXT, group_id INTEGER)";
-
- var statement:SQLStatement = new SQLStatement(); // Создаем объект
- statement.sqlConnection = DBConnection; // Указываем базу по отношению к которой будем выполнять запрос
- statement.text = PeoplesTable; // Указываем текст запроса
- statement.addEventListener(SQLErrorEvent.ERROR, DBError); // Добавляем обработчик события возникающего при соединении
- statement.addEventListener(SQLEvent.RESULT, TableResult); // Добавляем обработчик события возникающего при успешном создании таблицы
- statement.execute(); // Инициализируем обработку запроса
* This source code was highlighted with Source Code Highlighter.
Справились. База с таблицами создана и готова к работе. Осталось только заполнить ее данными и научится их извлекать.
Рассмотрим пример добавления информации в таблицу:
- var InsertIntoPeoples:String = "INSERT INTO peoples (lname, fname, ffname, date, group_id) VALUES (@column0, @column1, @column2, @column3, @column4)";
-
- var LNameArray :Array = ["Иванов", "Сидоров", "Козлов", "Игнатенко", "Борьщев", "Кольченко", "Бузякин"];
- var FNameArray :Array = ["Иван", "Николай", "Артем", "Игорь", "Сергей", "Борис", "Алексей"];
- var FFNameArray:Array = ["Алексеевич", "Борисович", "Игоревич", "Артемович", "Николаевич", "Иванович", "Сергеевич"];
-
- var statement2:SQLStatement = new SQLStatement();
- statement2.sqlConnection = DBConnection;
- statement2.text = InsertIntoPeoples;
- statement2.addEventListener(SQLErrorEvent.ERROR, DBError);
- statement2.addEventListener(SQLEvent.RESULT, InsertResult);
-
- for(var j:Number = 0; j < 100; j++)
- {
- statement2.parameters["@column0"] = LNameArray[Math.round(Math.random() * 6)];
- statement2.parameters["@column1"] = FNameArray[Math.round(Math.random() * 6)];
- statement2.parameters["@column2"] = FFNameArray[Math.round(Math.random() * 6)];
- statement2.parameters["@column3"] = (Math.round(Math.random() * 30) + 1) + ':' + (Math.round(Math.random() * 11) + 1) + ':' + (Math.round(Math.random() * 2009) + 1);
- statement2.parameters["@column4"] = Math.round(Math.random() * 3);
- statement2.execute();
- }
-
- /**
- * Эта функция обрабатывает удачное добавление данных в таблицу
- */
- private function InsertResult(e:SQLEvent):void
- {
- trace("Add to table successfully");
- }
* This source code was highlighted with Source Code Highlighter.
В данном примере в конструкции INSERT используется ссылки "@column0" они нужны для упрощения добавления данных при помощи цикла. Это гораздо удобнее чем использовать строку с переменными которую перед каждым добавлением приходится переопределять.
Теперь попробуем извлечь данные из таблицы:
- var q:String = "SELECT * FROM groups ORDER BY name";
-
- var getGroupStat:SQLStatement = new SQLStatement();
- getGroupStat.sqlConnection = DBConnection;
- getGroupStat.text = q;
- getGroupStat.addEventListener(SQLErrorEvent.ERROR, DBError);
- getGroupStat.addEventListener(SQLEvent.RESULT, GetGroupResult);
- getGroupStat.execute();
-
- /**
- * Обрабатывает результат выполнения функции GetGroup().
- */
- private function GetGroupResult(e:SQLEvent):void
- {
- var result:SQLResult = e.target.getResult();
-
- var GroupArray:ArrayCollection = new ArrayCollection();
-
- if(result.data)
- for(var i:Number = 0; i < result.data.length; i++)
- GroupArray.addItem(result.data[i]);
- }
* This source code was highlighted with Source Code Highlighter.
В функции GetGroupResult() переменной result присваивается результат запроса SELECT он представляет из себя массив переменных типа Object:
- [[object Object],[object Object],[object Object],[object Object]]
* This source code was highlighted with Source Code Highlighter.
Его лучше всего использовать присвоив переменной типа ArrayCollection, для удобного обращения к данным по имени (GroupArray[i].name).
Для удаления и обновления данных используются конструкции подобные тем которые мы рассмотрели отличаются только строковые запросы к базе.
В завершении урока хотелось бы отметить, что если в вашем AIR приложении используется некое хранилище данных то лучше чем SQLite файла не найти, поскольку работа с ним гораздо быстрее чем с файлом TXT или даже XML.
Прилагаю исходник к уроку (проект для Flex Builder 3.2).
Подсказали quickhighlighter.com, спасибо kutu