Вы находитесь на странице: 1из 33

Desenvolvimento Java para

PDA

Prof. Edson Alves de Oliveira Junior


edson@edsonjr.pro.br
Persistência de Dados
Introdução
• Existem 03 formas de persistência de dados em
SuperWaba:
1. Gravando tipos primitivos e Strings e manipulando um
arquivo normal (Classe File), em que a estrutura é flexível

2. Gravando em um arquivo PDB por meio da classe Catalog,


em que os registros não possuem um formato predefinido

3. Usando a biblioteca PDBDriver, em que é possível usar


instruções SQL para a manipulação das estruturas de tabelas
e registros

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Introdução
• Vantagens e desvantagens:
– Manipulação de arquivos é restrita no Palm OS e PDAs que possuem
suporte a cartão de memória

– O uso de arquivos PDB facilita a organização dos registros, porém não


existe o conceito de campos dentro de registros
• O programa que deve cuidar de gravar os dados no formato desejável

– Quantidade de dados pequena e as pesquisas são simples é mais


recomendado gravar em arquivos PDB
• o PDB funciona em todas as plataformas suportadas pelo SuperWaba

– Para a manipulação de grandes quantidades de dados é recomendável


usar a biblioteca de suporte à SQL

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Persistência em Arquivos
Classe waba.io.Stream
• É superclasse de todas as streams de dados
• Possui métodos de leitura, gravação, verificação de abertura e
fechamento de streams:
– int readBytes(byte[], int, int):
• lê os bytes de um stream e retorna o número de bytes lidos ou -1 caso
ocorra erro. Os bytes lidos são armazenados no array passado como
parâmetro. O primeiro int é o índice do array onde começara serão
armazenados os bytes e o segundo int a quantidade de bytes a serem lidos
– int writeBytes(byte[], int, int):
• escreve os bytes passados como parâmetro e retorna o número de bytes
escritos ou -1 caso haja erro. O primeiro int é o índice do array a começar a
ser escrito e o segundo int é a quantidade de bytes a escrever
– boolean close():
• fecha o stream, true se ok, false se erro
– boolean isClose():
• Retorna true se o stream estiver aberto

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Persistência em Arquivos
Classe waba.io.DataStream

• Permite a leitura e gravação de tipos primitivos e


Strings em uma stream
• Os métodos disponíveis para leitura e gravação
retornam ou recebem somente arrays de bytes
– Todos os tipos primitivos devem ser quebrados em bytes

– Exemplo: um int possui 4 bytes (32 bits), logo deve ser


quebrado em 4 partes, uma para cada byte

• A gravação de Strings deve ser feita quebrando a


String em um array de char

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Persistência em Arquivos
Classe waba.io.DataStream

Tipo Método de Gravação Método de Leitura Observação

boolean writeBoolean readBoolean Um byte (0 ou 1)

readByte
byte writeByte
readUnsignedBute Sem sinal (0 a 255)
readShort
writeShort
short readShortLE
writeShortLE
readUnsignedShort Sem sinal (0 a 65535)
writeInt readInt
int
writeIntLE readIntLE

long writeLong readLong

float writeFloat readFloat

double writeDouble readDouble

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Persistência em Arquivos
Classe waba.io.DataStream

Método de Método de
Tipo Observação
Gravação Leitura

char writeChar readChar 2 bytes

writeString readString Strings terminam


String
writeCString readCString com o ‘0’

byte[] writeBytes readBytes

char[] writeChars readChars

String[] writeStringArray readStringArray

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Persistência em Arquivos
Classe waba.io.ResizeStream

• Classe utilizada para expandir o registro de forma que


caiba de forma exata em um arquivo PDB
• Seu uso é bem simples, basta utilizar os métodos:
– boolean startRecord(): adiciona um registro ao final do
arquivo

– boolean startRecord(int): adiciona um registro na posição


indicada

– boolean restartRecord(int): sobrepõe um registro na


posição indicada

– void endRecord(): redimensiona o registro adicionado


Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©
Persistência em Arquivos Usando Catalog
• Os arquivos PDB possuem um formato próprio, sendo este:
– Cabeçalho:
• Informações como nome do PDB, atributos, data da última modificação, data
de criação, versão, entre outras

– Lista de ponteiros para os registros:


• Cada registro pode ter tamanho diferente, informando onde começa cada
registro (lista)
• Não existe um formato definido para cada registro
• O arquivo PDB é visto como um array em que cada item é um array de bytes
contendo dados
• Nenhuma informação sobre os registros é armazenada no PDB

– Registros....

• Os arquivos PDB são manipulados pela classe Catalog


Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©
Persistência em Arquivos Usando Catalog
Classe waba.io.Catalog
• São arquivos que podem ser facilmente intercambiáveis entre
plataformas
• Os arquivos PDB aceitam no máximo 65535 registros
– Cada registro no máximo 64KB
– Por causa da limitação do Palm OS na alocação de memória
• Construtor:
– Catalog(String, int):
• String: representa o nome do arquivo PDB no formato
NomeDoPDB.XXXX.TIPO
– NomeDoPDB: nome do arquivo limitado a 32 letras
– XXXX: creator ID, idêntico ao da aplicação, sempre com 4 letras
– TIPO: a ser definido pelo usuário. Ex.: DATA
• int: representa o modo de operação do arquivo:
– CREATE: cria o arquivo se não existir, passando a READ_WRITE
– READ_WRITE: abre para leitura e escrita
– READ_ONLY e WRITE_ONLY: sempre abre como READ_WRITE

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Persistência em Arquivos Usando Catalog
Classe waba.io.Catalog

• É possível descobrir se um arquivo PDB já existe


Catalog cat = new Catalog(“PessoaDB.iePU.DATA”,
Catalog.READ_WRITE);
if(cat.isOpen()) { ..... }

• A forma mais correta de se usar a classe Catalog é criando uma


subclasse desta e implementando seus próprios métodos
• O método boolean setRecordPos(int) posiciona o ponteiro no
registro indica, travando-o
• O método int getRecordCount() retorna o número de registros
no arquivo PDB
• O método boolean delete() apaga o arquivo PDB inteiro e o
método boolean deleteRecord() apaga o registro corrente
Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©
Exemplo - Catalog

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Exemplo - Catalog

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Exemplo
- Catalog

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Exemplo - Catalog

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Exemplo - Catalog

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Resultado - Catalog

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Persistência com SQL
• Utilizada quando o volume de dados é muito grande e consultas
complexas devem ser feitas
– DataStream e Catalog são restritas
• É possível manipular arquivos PDB por meio de SQL
– Com os conceitos de banco de dados e SQL:
• Manipulação de tabelas
• Manipulação de registros

• Para tanto, existem 2 drivers disponíveis:


– PDBDriver: desenvolvido pela equipe da SuperWaba e não exige outro
produto
– DB2e: criado pela IBM e requer o produto IBM DB2 Embedded
• Os 2 drivers implementam um conjunto próprio de métodos
para a sua manipulação

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Persistência com SQL
PDBDriver
• Possui todos os métodos para a execução de consulta e
gerenciamento de tabelas e índices
– Existe a relação: 1 aplicação Æ n tabelas
– Tabelas amarradas pelo creator id

• Segue o modelo Singleton


– Uma instância por creator id
– Usa o método getInstance()
– Ex.: PDBDriver driver = PDBDriver.getInstance(“xxxx”);

• Quando alguma tabela é referenciada, o arquivo referente é


travado
• As instruções SQLs não são case sensitives
Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©
Persistência com SQL
PDBDriver
• Criação de tabelas e índices é feita por meio do método
execute(String)
– Tabelas são criadas com “create table...”
• Sintaxe: create table TABELA (CAMPO1 TIPO, ....)
• TABELA: nome da tabela com limite de 25 caracteres e sem espaço
• CAMPO: nome do campo
• TIPO: tipo do campo, podendo ser: short, int, long, float, double, char[],
char[] nocase
– Índices são criados com “create index...”
• Sintaxe: create index NOME on TABELA(CAMPO)
• NOME: nome do índice, pode ser qualquer um, pois é ignorado
• TABELA: nome da tabela
• CAMPO: nome do campo para qual se deseja criar o índice

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Persistência com SQL
PDBDriver
• Se a tabela ou índice já existir a exceção
AlreadyCreatedException é lançada
• O método boolean exists(String) retorna se uma tabela já existe.
Exemplo:
– if(!driver.exists(“PessoaDB”)) {
• // cria a tabela
– }
• As exceções PrimaryKeyException e SQLParseException são
lançadas se uma chave primária já existe ou quando há algum
erro SQL, respectivamente
• Insert, update, drop ou delete devem ser feitos com o método
executeUpdate(String) que retorna o número de linhas afetadas
• Já o método executeQuery(String) é usado para executar
consultas somente

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Persistência com SQL
PDBDriver
• O método int getRecordCount(String) retorna o
número total de uma tabela (incluindo os apagados)
• O método int getRowCount(String) retorna o número
de linhas da tabela, sem considerar os apagados
• A remoção física dos registros pode ser feita pelo
método purge()
– Remove todos os índices

– Remove os registros

– Recria os índices

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Persistência com SQL
PDBDriver
• A classe PreparedStatement é utilizada para consultas e
execuções em lote
– criada pelo método prepareStatement() do PDBDriver

• Exemplo de Uso:
– PreparedStatement ps = driver.prepareStatement(“insert into
– PessoaDB values (?, ?, 1500)”);

– ps.setInt(0, 10);

– ps.setDouble(1, 25.0);

– ps.executeUpdate();

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Persistência com SQL
PDBDriver
• A classe ResultSet é usada como cursor para os registros resultantes de uma
consulta
• Os métodos abaixo são usados para posicionar o registro a ser retornado:

Nome Posicionamento
first Primeira linha
last Última linha
next Próxima linha
prev Linha anterior
beforeFirst Antes da primeira linha
afterLast Depois da última linha
absolute Linha indicada
Relativamente à linha atual
relative
(+ ou -)
Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©
Persistência com SQL
PDBDriver
• A classe ResultSetMetaData retorna informações sobre o
ResultSet
• Os métodos disponíveis:
– int getColumnCount(): número de colunas
– int getColumnDisplaySize(int): tamanho ideal para exibição
– String getColumnLabel(int): título da coluna
– int getColumnType(int): tipo da coluna
• A classe DBListBox é utilizada para exibir os dados de um
campo de uma consulta
• A classe Grid implementa uma tabela com características como
rolagem horizontal e alteração do tamanho da coluna
– Os dados são paginados automaticamente

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Persistência com SQL
Exemplo Grid

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Resultado – Exemplo Grid

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Avaliação da Disciplina

Trabalho Prático
Avaliação
• Implementar uma agenda de contatos e compromissos em
SuperWaba, de acordo com as seguintes diretrizes:
– Contatos: codigo, nome, telefone, email
– Compromissos: codigo, descricao, data, hora
– Utilizar persistência usando Catalog ou PDBDriver (SQL)
– Contatos e compromissos devem disponibilizar:
• Inserção, atualização, exclusão e consulta
– Para consulta, utilizar a classe superwaba.ext.xplat.ui.db.Grid para a
exibição dos dados
– O TRABALHO DEVE SER FEITO EM DUPLA!!!
– Entregar o código-fonte do projeto, bem como os arquivos PDB (da
aplicação e dos BD) e PRC

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Avaliação - Estrutura da Aplicação
• avaliacao.cp.utfpr.modelo.bd
– Pacote das classes de persistência

• avaliacao.cp.utfpr.modelo.beans
– Pacote com os beans para Contato e
Compromisso

• avaliacao.cp.utfpr.visao
– Pacote com as classes de interface
gráfica, MainWindow, Containers,
etc.....

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Avaliação
• Dicas:
– Utilizar a troca de containers para facilitar e otimizar a interface gráfica
com o cliente

– Utilizar posicionamento relativo para permitir a execução da aplicação em


qualquer tamanho de tela em PDAs de diferentes fabricantes

– Utilizar os exemplos implementados em sala de aula

• O TRABALHO SERÁ AVALIADO DE ACORDO COM OS


CRITÉRIOS A SEGUIR:
– Estrutura da aplicação (se a aplicação está estruturada como exigido)

– Funcionalidades requisitadas (inserção, atualização, exclusão e consulta)

– Entrega do código-fonte mais os arquivos relacionados (PDBs e PRC)

Prof. Edson A. O. Junior - Desenvolvimento Java para PDA©


Bom Trabalho a Todos !!!

Вам также может понравиться