Sobre bancos de dados SQL locais

Adobe AIR 1.0 e posterior

Veja uma explicação rápida e exemplos de códigos para o uso de bancos de dados SQL nos seguintes artigos de apresentação rápida do Adobe Developer Connection:

O Adobe AIR inclui um mecanismo de banco de dados relacional baseado em SQL que é executado no tempo de execução, com dados armazenados localmente em arquivos de banco de dados no computador em que o aplicativo do AIR é executado (no disco rígido do computador, por exemplo). Como a execução do banco de dados ocorre localmente, da mesma forma que o armazenamento dos arquivos de dados, um banco de dados pode ser usado por um aplicativo do AIR independentemente de haver uma conexão de rede disponível. Por isso, o mecanismo de banco de dados SQL local do tempo de execução é conveniente para armazenar dados de aplicativo locais persistentes, principalmente se você tem experiência em SQL e bancos de dados relacionais.

Usos de bancos de dados SQL locais

A funcionalidade de banco de dados SQL local do AIR pode ser utilizada para qualquer finalidade quando você quiser armazenar dados de aplicativo no computador local de um usuário. O Adobe AIR inclui diversos mecanismos para armazenar dados localmente, e cada um deles tem suas próprias vantagens. Veja abaixo alguns dos usos possíveis de um banco de dados SQL local no aplicativo do AIR:

  • No caso de um aplicativo orientado a dados (um catálogo de endereços, por exemplo), é possível usar um banco de dados para armazenar os principais dados de aplicativo.

  • No caso de um aplicativo orientado a documento, em que os usuários criam documentos para salvá-los e possivelmente compartilhá-los, cada documento pode ser salvo como um arquivo de banco de dados em um local designado pelo usuário. (Observe, no entanto, que a menos que o banco de dados seja criptografado, qualquer aplicativo do AIR poderia abrir o arquivo do banco de dados. A criptografia é recomendada para documentos potencialmente confidenciais.)

  • No caso de um aplicativo com reconhecimento de rede, é possível usar um banco de dados para armazenar um cache local de dados de aplicativo ou para armazenar dados temporariamente quando não há uma conexão de rede disponível. Você pode criar um mecanismo para sincronizar o banco de dados local com o armazenamento de dados da rede.

  • No caso de qualquer aplicativo, um banco de dados pode ser usado para armazenar configurações de aplicativo de um usuário, como opções ou informações do aplicativo (por exemplo, o tamanho e a posição das janelas).

Sobre bancos de dados do AIR e arquivos de banco de dados

Um banco de dados SQL local do Adobe AIR é armazenado como um único arquivo no sistema de arquivos do computador. O tempo de execução inclui o mecanismo de banco de dados SQL que gerencia a criação e a estruturação de arquivos de banco de dados, bem como a manipulação e a recuperação de dados de um arquivo de banco de dados. O tempo de execução não especifica como ou onde os dados de banco de dados são armazenados no sistema de arquivos; cada banco de dados é armazenado por completo em um único arquivo. Você especifica o local no sistema de arquivos em que o arquivo do banco de dados deve ser armazenado. Um único aplicativo do AIR pode acessar um ou vários bancos de dados separados (isto é, arquivos de banco de dados separados). Como o tempo de execução armazena cada banco de dados como um único arquivo no sistema de arquivos, você pode localizar o seu banco de dados quando necessário pelo design das restrições do sistema operacional quanto ao acesso a aplicativos e arquivos. Cada usuário pode ter um arquivo de banco de dados à parte para seus dados específicos, ou um arquivo de banco de dados pode ser acessado por todos os usuários do aplicativo em um único computador para dados compartilhados. Como os dados estão armazenados localmente em um único computador, eles não são compartilhados automaticamente em diferentes computadores. O mecanismo de banco de dados SQL local não tem um recurso que permita executar instruções SQL em um banco de dados remoto ou baseado em servidor.

Sobre bancos de dados relacionais

Um banco de dados relacional consiste em um mecanismo para armazenar (e recuperar) dados em um computador. Os dados são organizados em tabelas: as linhas representam registros ou itens, e as colunas (também chamadas de “campos”) dividem cada registro em valores individuais. Por exemplo, um aplicativo de catálogo de endereços pode conter uma tabela chamada “amigos”. Cada linha da tabela representa um único amigo armazenado no banco de dados. As colunas da tabela representam dados como nome, sobrenome, data de nascimento e assim por diante. Para cada linha de amigo na tabela, o banco de dados armazena um valor em separado para cada coluna.

Os bancos de dados relacionais têm a finalidade de armazenar dados complexos, em que um item é associado ou relacionado a itens de outro tipo. Em um banco de dados relacional, qualquer dado que tem um relacionamento um para muitos — em que um único registro pode estar relacionado a vários registros de um tipo diferente — deve ser dividido entre diferentes tabelas. Por exemplo, suponha que você queira que o aplicativo de catálogo de endereços armazene vários números de telefone de cada amigo; isto é um relacionamento um para muitos. A tabela “amigos” contém todas as informações pessoais de cada amigo. Uma tabela à parte chamada “números de telefone” contém todos os números de telefone de todos os amigos.

Além de armazenar os dados de amigos e os números de telefone, cada tabela precisa de dados para controlar os relacionamentos entre as duas tabelas — a fim de comparar registros de amigo individuais com seus números de telefone. Esses dados são chamados de chave primária, um identificador exclusivo que diferencia cada linha de uma tabela das demais linhas dessa tabela. A chave primária pode ser uma “chave natural”, ou seja, um dos itens de dados que diferencia cada registro de uma tabela naturalmente. Na tabela “amigos”, se você souber que nenhum dos seus amigos tem a mesma data de aniversário, poderá usar a coluna de data de nascimento como a chave primária (uma chave natural) dessa tabela. Se não houver uma chave natural, crie uma coluna de chave primária em separado, como “id de amigo”: um valor artificial que o aplicativo usa para diferenciar entre as linhas.

Utilizando uma chave primária, você pode configurar relacionamentos entre várias tabelas. Por exemplo, suponha que na tabela "amigos" exista uma coluna chamada "id de amigo", que contém um número exclusivo para cada linha (cada amigo). A tabela “números de telefone” relacionada pode ser estruturada com duas colunas: uma com o “id de amigo” do amigo a quem pertence o número de telefone e outra com o número de telefone propriamente dito. Assim, independentemente de quantos números de telefones um só amigo tiver, todos poderão ser armazenados na tabela “números de telefone” e vinculados ao amigo relacionado através da chave primária “id de amigo”. Quando uma chave primária de uma tabela é usada em uma tabela relacionada para especificar a conexão entre os registros, o valor contido na tabela é chamado de chave externa. Diferentemente de muitos bancos de dados, o mecanismo de banco de dados local do AIR não permite criar restrições de chave externa, que são restrições que automaticamente verificam se um valor de chave externa inserido ou atualizado tem uma linha correspondente na tabela de chave primária. Todavia, os relacionamentos de chave externa são uma parte importante da estrutura de um banco de dados relacional, e as chaves externas devem ser usadas quando você cria relacionamentos entre as tabelas do banco de dados.

Sobre a SQL

A SQL (linguagem de consulta estruturada) é usada com bancos de dados relacionais para manipular e recuperar dados. A SQL é uma linguagem descritiva e não de procedimento. Em vez de dar ao computador instruções sobre como recuperar dados, uma instrução SQL descreve o conjunto de dados desejado. O mecanismo de banco de dados determina como recuperar esses dados.

A linguagem SQL foi padronizada pelo ANSI (American National Standards Institute). O banco de dados SQL local do Adobe AIR oferece suporte à maior parte do padrão SQL-92.

Para obter descrições específicas da linguagem SQL suportada no Adobe AIR, consulte Suporte SQL em bancos de dados locais.

Sobre classes de banco de dados SQL

Para trabalhar com bancos de dados SQL locais no ActionScript 3.0, você deve usar ocorrências destas classes do pacote flash.data:

Classe

Descrição

flash.data.SQLConnection

Oferece um modo de criar e abrir bancos de dados (arquivos de banco de dados), bem como métodos para executar operações no nível de banco de dados e controlar transações de banco de dados.

flash.data.SQLStatement

Representa uma única instrução SQL (uma única consulta ou comando) que é executada em um banco de dados, incluindo a definição do texto da instrução e a configuração dos valores de parâmetro.

flash.data.SQLResult

Oferece um modo de obter informações sobre execução de uma instrução ou os resultados dela, como as linhas de resultado de uma instrução SELECT, o número de linhas afetadas por uma instrução UPDATE ou DELETE e assim por diante.

Para obter informações de esquema que descrevam a estrutura de um banco de dados, use estas classes do pacote flash.data:

Classe

Descrição

flash.data.SQLSchemaResult

Funciona como um contêiner de resultados do esquema de banco de dados gerados pela chamada do método SQLConnection.loadSchema().

flash.data.SQLTableSchema

Fornece informações que descrevem uma única tabela de um banco de dados.

flash.data.SQLViewSchema

Fornece informações que descrevem uma única visualização de um banco de dados.

flash.data.SQLIndexSchema

Fornece informações que descrevem uma única coluna de uma tabela ou visualização de um banco de dados.

flash.data.SQLTriggerSchema

Fornece informações que descrevem um único disparador de um banco de dados.

Outras classes do pacote flash.data fornecem constantes que são utilizadas com as classes SQLConnection e SQLColumnSchema:

Classe

Descrição

flash.data.SQLMode

Define um conjunto de constantes que representam os possíveis valores do parâmetro openMode dos métodos SQLConnection.open() e SQLConnection.openAsync().

flash.data.SQLColumnNameStyle

Define um conjunto de constantes que representam os possíveis valores da propriedade SQLConnection.columnNameStyle.

flash.data.SQLTransactionLockType

Define um conjunto de constantes que representam os possíveis valores do parâmetro de opção do método SQLConnection.begin().

flash.data.SQLCollationType

Define um conjunto de constantes que representam os valores possíveis para a propriedade SQLColumnSchema.defaultCollationType e o parâmetro defaultCollationType do construtor SQLColumnSchema().

Além disso, as seguintes classes do pacote flash.events representam os eventos (e as constantes de suporte) que você utiliza:

Classe

Descrição

flash.events.SQLEvent

Define os eventos que uma ocorrência de SQLConnection ou SQLStatement despacha quando alguma de suas operações é executada com êxito. Cada operação tem uma constante de tipo de evento associada definida na classe SQLEvent.

flash.events.SQLErrorEvent

Define o evento que uma ocorrência de SQLConnection ou SQLStatement despacha quando alguma de suas operações resulta em erro.

flash.events.SQLUpdateEvent

Define o evento que uma ocorrência de SQLConnection despacha quando dados de tabela de um dos bancos de dados conectados são alterados como resultado da execução de uma instrução SQL INSERT, UPDATE ou DELETE.

Para finalizar, as seguintes classes do pacote flash.errors fornecem informações sobre erros de operação do banco de dados:

Classe

Descrição

flash.errors.SQLError

Fornece informações sobre um erro de funcionamento do banco de dados, incluindo a operação que foi tentada e a causa da falha.

flash.errors.SQLErrorOperation

Define um conjunto de constantes que representam os valores possíveis para a propriedade operation da classe SQLError, que indica a operação de banco de dados que resultou em erro.

Sobre modos de execução síncrona e assíncrona

Quando você cria código para trabalhar com um banco de dados SQL local, especifica que a execução das operações de banco de dados ocorra de um destes dois modos de execução: modo de execução assíncrona ou síncrona. Em geral, os exemplos de código mostram como executar cada operação das duas maneiras, para que você possa usar o exemplo mais adequado às suas necessidades.

No modo de execução assíncrona, você dá uma instrução ao tempo de execução, que despacha um evento quando a operação solicitada é concluída ou quando falha. Primeiro você instrui o mecanismo de banco de dados a executar uma operação. O mecanismo de banco de dados trabalha em segundo plano enquanto o aplicativo continua a executar. Por último, quando a operação é concluída (ou se falha), o mecanismo de banco de dados despacha um evento. O seu código, disparado pelo evento, executa operações subsequentes. Esta abordagem tem uma vantagem significativa: o tempo de execução realiza as operações de banco de dados em segundo plano enquanto o código do aplicativo principal continua en execução. Se a operação de banco de dados demorar muito tempo, o aplicativo continuará executando. O mais importante é que o usuário pode continuar a interagir com ele sem que a tela congele. Entretanto, o código de operação assíncrona pode ser mais complexo de criar do que outro código. Essa complexidade geralmente ocorre quando várias operações dependentes devem ser divididas entre diversos métodos de ouvinte de evento.

Em termos conceituais, é mais fácil codificar operações como uma sequência simples de etapas (um conjunto de operações síncronas) e não como um conjunto de operações divididas em vários métodos de ouvinte de evento. Além das operações de banco de dados assíncronas, o Adobe AIR também permite executar operações de banco de dados de maneira síncrona. No modo de execução síncrona, as operações não são executadas em segundo plano. Elas ocorrem na mesma sequência de execução que todos os outros códigos de aplicativo. Você instrui o mecanismo de banco de dados a executar uma operação. Em seguida, o código pausa nesse ponto enquanto o mecanismo de banco de dados faz o seu trabalho. Quando a operação é concluída, a execução prossegue com a próxima linha do código que você criou.

O fato de as operações serem executadas de maneira assíncrona ou síncrona é definido no nível de SQLConnection. Usando uma única conexão de banco de dados, você não consegue executar algumas operações ou instruções em modo síncrono e outras em modo assíncrono. Você especifica se uma classe SQLConnection opera no modo de execução síncrono ou assíncrono chamando um método SQLConnection para abrir o banco de dados. Se você chamar SQLConnection.open(), a conexão funcionará no modo de execução síncrona; se você chamar SQLConnection.openAsync(), ela funcionará no modo de execução assíncrona. Uma vez que uma ocorrência de SQLConnection é conectada a um banco de dados usando open() ou openAsync(), ela é fixada ao modo de execução síncrona ou assíncrona, a menos que você feche e reabra a conexão com o banco de dados.

Cada modo de execução tem suas vantagens. Apesar da semelhança entre a maioria dos aspectos de cada modo, existem algumas diferenças das quais você deve se lembrar quando trabalhar neles. Para obter mais informações sobre estes tópicos, e sugestões de como trabalhar em cada modo, consulte Uso de operações de banco de dados síncronas e assíncronas.