Tecnologia do Blogger.

Localizar

sábado, 4 de fevereiro de 2012

Android para Desenvolvedores - Parte 2


1       BANCO DE DADOS

Normalmente a interação entre usuários e dados gravados pelo sistema é feita através de um SGBD (Sistema Gerenciador de Banco de Dados).
Segundo o Wikipidia “um Sistema de Gerenciamento de Banco de Dados (SGBD) é o conjunto softwares responsáveis pelo gerenciamento de um banco de dados. Seu principal objetivo é retirar da aplicação cliente a responsabilidade de gerenciar o acesso, a manipulação e a organização dos dados no arquivo. O SGBD disponibiliza uma interface para que seus clientes possam incluir, alterar ou consultar dados previamente armazenados. Em bancos de dados relacionais a interface é constituída pelas APIs (Application Programming Interface) ou drivers do SGBD, que executam comandos na linguagem SQL (Structured Query Language).”

Para o SO Android podemos contar com o SQLite. O SQLite é um SGBD que não instala um SGBD. Isso é meio confuso mesmo, mas o SQLite é apenas uma biblioteca de código que implementa o acesso ao banco de dados existente em um único arquivo, não precisando então de instalação, configuração e administração.
Um aplicativo usando esta biblioteca de acesso escreve e lê neste banco de dados sem que seja necessário acessar um SGBD o que caracteriza o SQLite mais como uma ferramenta de acesso a dados do que um SGBD na minha opinião.
Este único arquivo de banco de dados com extenção (*.db) é capaz de conter várias tabelas que podem ser facilmente criadas com a execução do comando CREATE TABLE já muito conhecido pelos desenvolvedores e seus dados podem ser facilmente manipulados pelos comandos SELECT, INSERT e UPDATE, já que Implementa a maioria do SQL92.
Devido a sua baixa complexidade o desempenho do banco de dados é muito grande sendo mais rápido que o já consolidado MySQL.
Apesar de estarmos focados no uso deste banco por aplicativos Android o SQLite pode ser acessado por qualquer tipo de aplicativos sendo capaz de armazenar mais de 2 Teras de dados.
No caso de desenvolvimento de sites usando este banco é importante atentar para as seguintes recomendações.
Exemplos de uso do SQLite são, não restrito a :
·         sites com menos de cem mil requisições por dia,
·         dispositivos e sistemas embarcados,
·         aplicações desktop,
·         ferramentas estatísticas e de análise,
·         aprendizado de banco de dados,
·         implementação de novas extensões de SQL.
Não se recomenda o uso do SQLite para sites com:
·         muitos acessos,
·         grande quantidades de dados (talvez maior que algumas dúzias de gigabytes),
·         sistemas com grande concorrência,
·         aplicações cliente/servidor.
Apesar de o SQLite ser uma ferramenta gratuita, multiplataforma, suportar transações e ser muito prático e rápido ele não possui suporte a integridade relacional o que me lembra muito os tempos do velho paradox onde tínhamos acesso direto ao arquivo através de uma biblioteca.

1.1       Classes para acesso ao SQLite

Todas as classes para acesso aos dados de um SQLite podem ser encontradas dentro do pacote “android.database.sqlite”.
Neste artigo será explanado somente sobre as principais classes para e seus métodos para uso na construção de uma aplicação. Até o final do artigo montaremos uma aplicativo para Android utilizando dos recursos apresentados neste atigo.

1.1.1     SQLiteCursor

Esta classe implementa o resultado de uma consulta feita na base de dados retornando uma coleção de dados a serem utilizados na aplicação.

1.1.1.1     Métodos públicos


Método
Retorno
Descrição
close
Vazio
Fecha o cursor liberando todos os seus recursos tornando-o completamente inválido.
deactivate
Vazio
Desativa o cursor fazendo com que todas as chamadas sobre ele sejam inválidas. O cursor pode ser reativado executando-se o método requery.
getColumnIndex
int
Contendo como parâmetro o nome da coluna, retorna o índice no qual esta coluna está indexada. O índice das colunas começam em zero até n e caso a coluna não exista o valor retornado será -1.
getColumnNames
String[]
Retorna uma matriz de string contendo o nome de todas as colunas na ordem em que foram selecionadas no cursor.
getCount
int
Retorna o numero de linhas no cursor.
getDatabase
SQLiteDatabase

onMove
boolean
Este é um evento que é ativado toda vez que o cursor é rolado para uma nova posição. Possui dois parâmetros: oldPosition e newPosition.
requery
boolean
Executa a consulta que criou o cursor novamente reabrindo os dados atualizando seu conteúdo.
setSelectionArquments
Vazio
Modifica a seleção dos arqumentos.
setWindow
Vazio
Utiliza o cursor em uso em uma nova janela. Possui apenas um parâmetro, a janela para onde o cursor será enviado.




Função
Retorno
Descrição
Funções do cursor
SqlGetColCount(cursor)
int
Retorna o número de colunas existentes no cursor selecionado.
SqlGetColIndex(cursor,name$)
int
Retorna o índice da coluna (name$) existente no (cursor)
SqlGetColName$(cursor,index)
String
Retorna o nome da coluna existente na posição (index) para o (cursor).
SqlGetColNames$(cursor)
String[]
Retorna uma matriz de string contendo o nome de todas as colunas do (cursor).
SqlGetRecCount(cursor)
Int
Retorna o número de registros selecionados no (cursor)
isSqlCursorClosed(cursor)
Boolean
Retorna 1 se o cursor estiver fechado e 0 se o cursor estiver aberto.
Funções para leitura dos dados
SqlGetDouble(cursor,index)
Double
Efetua a leitura de um campo do tipo retorno no (cursor) para a coluna localizada na posição (index).
SqlGetFloat(cursor,index)
Float
SqlGetInt(cursor,index)
Int
SqlGetLong(cursor,index)
long
SqlGetShort(cursor,index)
short
SqlGetString$(cursor,index)
string
SqlGetI$(cursor{,delimiter$})
String
Efetua a leitura do valor de todas as colunas da posição corrente do cursor. Os valores são retornados com um valor delimitador. Caso o valor delimitador não tenha sido informado por padrão será separado por vírgula.
SqlGetA$(cursor)
Sring[]
Efetua a leitura de todas as colunas da posição corrente do cursor. Todos os valores são retornados em um array unidimensional.
SqlGetAll$(cursor)
String[]
Efetua a leitura de todas as colunas e todas as linhas selecionadas no cursor. Os dados são retornados em um array bidimensional que pode ser lido como s$(row, col).
isSqlColNull(cursor,index)
Boolean
Retorna 1 se a coluna (index) for igual a null e 0 caso não seja null.
Funções para posicionamento do cursor na coleção
isSqlBeforeFirst(cursor)
boolean
Retorna 1 quando o registro selecionados estiver antes do primeiro registro da coleção existente e retorna 0 caso isso não seja verdadeiro.
isSqlAfterLast(cursor)
boolean
Retorna 1 quando o registro selecionado estiver depois do ultimo registro da coleção existente e retorna 0 quando isso não for verdadeiro.
isSqlFirst(cursor)
boolean
Retorna 1 quando o registro selecionado estiver no primeiro registro da coleção existente e retorna 0 quando isso não for verdadeiro.
isSqlLast(cursor)
boolean
Retorna 1 quando o registro selecionado estiver no ultimo registro da coleção existente e retorna 0 quando isso não for verdadeiro.
SqlFirst(cursor)
boolean
Move o cursor para o primeiro registro da coleção existente retornando 1 quando a operação for realizada com sucesso e 0 quando não.
SqlNext(cursor)
boolean
Move o cursor para o registro posterior ao registro selecionado na coleção existente retornando 1 quando a operação for realizada com sucesso e 0 quando não.
SqlPrev(cursor)
boolean
Move o cursor para o registro anterior ao registro selecionado na coleção existente retornando 1 quando a operação for realizada com sucesso e 0 quando não.
SqlLast(cursor)
boolean
Move o cursor para o último registro da coleção existente retornando 1 quando a operação for realizada com sucesso e 0 quando não.
SqlMove(cursor,offset)
boolean
Move o (cursor) para frente quando (offset) for um valor positivo e para trás quando o valor for negativo retornando 1 se houver sucesso na operação e 0 caso contrario.
SqlPos(cursor,row)
boolean
Move o cursor para a o registro especificado (row) retornando 1 quando a operação for um sucesso e 0 no caso contrário.

1.1.2     SQLiteDatabase

Esta classe quando instanciada disponibiliza os métodos para gerenciamento do acesso ao banco de dados.
SQLiteDatabase possui métodos para criar, excluir, executar comandos SQL, e executar outras tarefas comuns no gerenciamento de banco de dados.

1.1.2.1     Constantes (http://developer.android.com)

CONFLICT_ABORT – Quando ocorre uma violação de restrição que não seja ROLLBACK preservando a execução de comandos anteriores dentro da mesma transação.
CONFLICT_FAIL – Quando ocorre uma violação de restrição abortando com um SQLITE_CONSTRAINT como código de retorno.
CONFLICT_IGNORE - Quando uma violação de restrição ocorre, a linha que contém a violação de restrição não está inserindo ou alterando.
CONFLICT_NONE - use o seguinte quando nenhuma ação conflito é especificada.
CONFLICT_REPLACE - Quando uma violação de restrição UNIQUE ocorre, as linhas pré-existentes que estão causando a violação de restrição são removidas antes de inserir ou atualizar a linha atual.
CONFLICT_ROLLBACK – Quando uma violação de restrição ocorre, um ROLLBACK imediatamente é acionado, terminando assim a transação corrente, abortando com o código SQLITE_CONSTRAINT.
CREATE_IF_NECESSARY - Sinalizar para OpenDatabase (String, SQLiteDatabase.CursorFactory, int) para criar o arquivo de banco de dados se ele não existir.
MAX_SQL_CACHE_SIZE - valor máximo absoluto que pode ser definido pelo setMaxSqlCacheSize (int) o tamanho de cada declaração preparada, é entre 1K - 6K, dependendo da complexidade da instrução SQL e esquema.
NO_LOCALIZED_COLLATORS - Sinaliza para OpenDatabase (String, SQLiteDatabase.CursorFactory, int) para abrir o banco de dados sem suporte para collators localizada.
OPEN_READONLY - Sinaliza para OpenDatabase (String, SQLiteDatabase.CursorFactory, int) para abrir o banco de dados somente para leitura.
OPEN_READWRITE - Sinaliza para OpenDatabase (String, SQLiteDatabase.CursorFactory, int) para abrir o banco de dados para leitura e escrita. Se o disco estiver cheio, isto pode falhar mesmo antes de você realmente escrever qualquer coisa no disco.
SQLITE_MAX_LIKE_PATTERN_LENGTH - Comprimento máximo padrão de um LIKE ou GLOB, o algoritmo de correspondência de padrão usado no padrão LIKE e implementação de GLOB SQLite podem exibir O (N ^ 2) performance (onde N é o número de caracteres no padrão) para determinados casos patológicos.

1.1.2.2     Método e funções públicos

Método
Retorno
Descrição
beginTransaction
Vazio
Inicia uma transação no modo EXCLUSIVE.
beginTransactionNonExclusive
Vazio
Inicia uma transação no modo IMMEDIATE.
beginTransactionWithListener
Vazio
Inicia uma transação no modo EXCLUSIVE.
beginTransactionWithListenerNonExclusive
Vazio
Inicia uma transação no modo IMMEDIATE.
Close
Vazio
Fecha o acesso ao banco de dados.
compileStatement
SQLiteStatement
Compila uma instrução SQL em um objeto de declaração reutilizável pré-compilados.
enableWriteAheadLogging
boolean
Este método permite a execução paralela de consultas de vários segmentos sobre o mesmo banco de dados.
endTransaction
Vazio
Termina uma transação
execSQL
Vazio
Executa uma única instrução SQL desde que esta não retorne dados.
findEditTable
string
Encontra o nome da primeira tabela, que é editável.
getAttachedDbs
List>
Retorna lista de nomes de caminho completo de todos os bancos de dados em anexo, incluindo banco de dados principal, executando 'database_list pragma' no banco de dados.
getMaximumSize
long
Retorna o tamanho máximo do banco de dados pode vir a ter.
getPageSize
long
Retorna o tamanho da página atual banco de dados, em bytes.
getPath
string
Obtém o caminho para o arquivo de banco de dados.
getVersion
int
Obtém a versão do banco de dados.
inTransaction
boolean
Retorna true se houver uma transação pedente.
isDatabaseIntegrityOk
boolean
Efetua a checagem de integridade do banco de dados
isOpen
boolean
Retorna true se o banco de dados estiver sendo acessado por este objeto instanciado.
isReadOnly
boolean
Retorna true se o banco de dados está aberto como somente leitura.
needUpgrade
boolean
Informa a nova versão para a base de dados.
openDatabase
SQLiteDatabase
openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags, DatabaseErrorHandler errorHandler)
Abre o banco de dados de acordo com o flag informado.
OPEN_READWRITE OPEN_READONLY CREATE_IF_NECESSARY e / ou NO_LOCALIZED_COLLATORS.
openOrCreateDatabase
SQLiteDatabase
Equivalent to openDatabase (path, factory, CREATE_IF_NECESSARY, errorHandler).
query
Cursor
Executa uma consulta retornando uma coleção de dados como resultado.
queryWithFactory
Cursor
Consulta a determinado URL, retornando um cursor sobre o conjunto de resultados.
rawQuery
Cursor
Executa o SQL fornecido e retorna um cursor sobre o conjunto de resultados.
rawQueryWithFactory
Cursor
Executa o SQL fornecido e retorna um cursor sobre o conjunto de resultados.
setLocale
Vazio
Define o local para o banco de dados.
setLockingEnabled
Vazio
Controlar ou não o SQLiteDatabase é feita thread-safe usando bloqueios em torno de seções críticas.
setMaxSqlCacheSize
Vazio
Define o tamanho máximo do cache de instrução preparado para este banco de dados.
setMaximumSize
long
Define o tamanho máximo do banco de dados vai crescer.
setPageSize
Vazio
Define o tamanho da página do banco de dados.
setTransactionSuccessful
Vazio
Marca a transação atual como bem sucedida.
setVersion
Vazio
Define a versão do banco de dados.
yieldIfContendedSafely
boolean
Temporariamente terminar a transação para que outros segmentos executado.

1.1.3     SQLiteQueryBuilder

Esta é uma classe muito conveniente que auxilia na construção de comandos SQLs a serem utilizados pelo objeto SQLiteDatabase.

1.1.3.1     Métodos e funções publicas

Método
Retorno
Descrição
appendColumns
Vazio
Este é um método estático para a montagem das colunas do StringBuildes, onde o nome das colunas são passados no seguindo parâmetro separados por virgula.
appendWhere
Vazio
Adiciona as partes da clausula WHERE da consulta.
appendWhereEscapeString
Vazio
buildQuery
String
Efetua a construção do comando SQL SELECT adequado ao uso. Estas instruções poderão ser unidas por meio de operadores UNION no buildUnionQuery.
buildQueryString
String
Método estático construir uma cadeia de consulta SQL a partir das cláusulas de dados.
buildUnionQuery
String
Dado um conjunto de subconsultas, todos os quais são instruções SELECT, cria uma consulta que retorna a UNION como uma subquery.
getTables
String
Retorna uma lista de tabelas que sendo usadas nas consultas.
query
Cursor
Realizar uma consulta combinando as configurações atuais e as informações passadas para este método.
setCursorFactory
Vazio
Define o cursor factory que será utilizado para a consulta.
setDistinct
Vazio
Marca a consulta como distinct
setProjectionMap
Vazio
Define o mapa de projeção para a consulta. Este método serve para evitar a ambiguidade de nome de colunas mapeando o nome de uma coluna de “coluna” para “tabela.coluna”.
setStrict
Vazio
Quando definido, a seleção é verificada, em relação argumentos maliciosos.
setTables
Vazio
Define a lista de tabelas para consulta.



1.1.4     SQLiteStatement

Esta classe é responsável por compilar os comandos SQL de UPDATE, INSERT, DELETE e demais comandos necessários no gerenciamento dos dados do banco.
Num primeiro momento esta classe pode não parecer a melhor a ser utilizado devido à necessidade de se informar o comando SELECT com os dados para montar o cursor. Mas, numa programação orientada a objetos tenho certeza que o desenvolvedor irá desejar usar esta classe em paralelo a classe SQLiteQueryBuilder que dará todo suporte ao objeto final não sendo preciso então a montagem de string com comandos SQLs para executar as operações.
O objeto não deve ser instanciado diretamente, mas através do método compileStatement existente numa instancia da classe SQLiteDatabase.

1.1.4.1     Métodos e Funções públicas

Método
Retorno
Descrição
execute
Vazio

executeInsert
long
Executa o comando de inclusão do registro retornando o ID da linha inserida por este comando.
executeUpdateDelete
int
Executa o comando necessário para confirmação das modificações na base de dados retornando o número de linhas afetado por este comando.
simpleQueryForBlobFileDescriptor
ParcelFileDescriptor
Executa uma instrução que retorna um 1 em 1 tabela com um valor blob.
simpleQueryForLong
long
Executar uma instrução que retorna um 1 em 1 tabela com um valor numérico.
simpleQueryForString
string
Executar uma instrução que retorna um 1 em 1 tabela com um valor de texto.