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.
|
(Fonte: http://developer.android.com)
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.
|
(Fonte: http://developer.android.com)
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.
|