Conforme combinado no artigo anterior, apresentarei nesta segunda parte uma maneira, entre as muitas existentes, de utilizar SQLite em suas aplicações de forma customizada utilizando OOP, apresentando também eventos e métodos que são úteis quando utilizamos SQLite em Flex AIR.
Este processo é importante, pois, como vimos anteriormente, para se trabalhar com SQLite são necessárias três classes, que tornam o desenvolvimento de uma aplicação pouco produtiva e, de certa forma, trabalhosa. Sendo assim, vamos criar uma classe que facilite todo esse processo.
Esta classe será criada como nome SQLite estendendo-se a classe SQLStatement, classe esta responsável pela execução de instruções SQL.
Segue a classe na integra:
/**
* Classe responsável por manipular todas as requisições SqLite.
*/
public class SQLite extends SQLStatement{
//----------------------------------------------------------------------
//
// Variáveis
//
//----------------------------------------------------------------------
/**
* Referência para o arquivo de dados.
*/
private var file:File = new File();
/**
* Instância do conector de dados.
*/
private var conn:SQLConnection;
//----------------------------------------------------------------------
//
// Métodos
//
//----------------------------------------------------------------------
/**
* Construtor.
* Cria a base de dados, abre a conexão e cria as tabelas necesárias ao
* funcionamento do sistema.
*
* @params database Nome da base de dados SqLite.
*/
public function SQLite(database:String = 'base.sqlite'){
// Chama o construtor do parent.
super();
// Cria uma referência para a base de dados.
file = File.documentsDirectory.resolvePath(database);
// Cria a conexão com a base de dados.
conn = new SQLConnection();
// Adiciona um ouvinte para erro de abertura da base de dados.
conn.addEventListener(SQLErrorEvent.ERROR, onError);
// Adiciona um ouvinte para erros de execução de queries.
addEventListener(SQLErrorEvent.ERROR, onError);
// Adiciona um ouvinte para tratar finalização da execução de uma
// query SQLite.
addEventListener(SQLEvent.RESULT, onResult);
// Cria a conexão.
this.sqlConnection = conn;
// Abre a conexão.
conn.open(file);
}
/**
* Função executada quando realizado uma chamada SQlite.
*/
private function onResult(e:SQLEvent):void {
// Limpa todos os dados da memória referentes a resultados
// (getResult) e substituição de parâmetros (parameters).
this.clearParameters();
}
/**
* Trata erros de execução de queries.
*/
private function onError(e:SQLErrorEvent):void {
Alert.show(e.error.details, "Erro");
}
}
A classe acima está toda comentada, então vamos priorizar os pontos mais importantes.
Repare que no construtor (função SQLite), tratamos a criação da base de dados, assim como a conexão com a mesma. Foram adicionados dois ‘ouvintes’ (addEventListener), responsáveis por tratar possíveis erros tanto na abertura/criação da base de dados, quanto na execução de queries, e um terceiro ‘ouvinte’ (addEventListener(SQLEvent.RESULT, onResult)) para tratar a finalização da execução de uma query.
Este último é muito importante quando executamos instruções SQL simultâneas, pois ele é responsável por chamar o método onResult, limpa os dados da memória referentes a valores contidos em parameters utilizando a função clearParameters.
Como utilizar a classe?
É bem simples utilizá-la. Como a classe SQLite estende a SQLStatement, ela tem todas as suas funcionalidades, sendo assim basta instanciá-la passando como parâmetro um nome para sua base de dados (caso contrário, será assumido como base.sqlite), conforme o exemplo abaixo:
private var sqlite:SQLite = new SQLite();
// Query para a criação da tabela 'nomes'.
sqlite.text = "CREATE TABLE IF NOT EXISTS nomes (" +
"name VARCHAR(200) NOT NULL)";
// Executa a criação.
sqlite.execute();
// Query para inclusão de um nome na tabela utilizada como exemplo.
sqlite.text = "INSERT INTO nomes( " +
" name " +
") VALUES ( " +
" @name)";
// Parâmetros de substituição.
sqlite.parameters['@name'] = "João Silva";
// Executa a inclusão.
sqlite.execute();
No exemplo, após criar uma instância da classe SQLite, foi incluído um nome em uma tabela ‘nomes’. Desta forma, quando a classe é instanciada, o construtor encarrega-se de criar/abrir a base de dados, criar a tabela ‘nomes’, caso a mesma ainda não exista e incluir um nome.
Bem, pessoal, é isso aí, espero que seja de bom proveito.
[]’s