Programa Expresso de
Capacitação
Módulo J2ME
Aula 5 – Record Management System
Pausa para reflexão
"Sem esforço não há progresso, mas com esforço também
não há progresso”
Ryotan Tokuda, Mestre Zen
Record Management System
• Gereciamento de registros persistentes
• Registro
• Identificador ligado a um array de bytes
• Equivalente a armazenamento em arquivo de
J2SE
• Classes para armazenar, recuperar, enumerar,
comparar e filtrar dados não-voláteis
RMS
• Armazém de registros (RecordStore)
ID de registro
Dado
1
2
Array de bytes
Array de bytes
...
..
• Nomenclatura
• Até 32 caracteres UNICODE (16 bits)
RMS
• Informações adicionais
• Número da versão: um valor inteiro que é
incrementado a cada modificação do conteúdo do
armazém
• Indicação de data/hora: última modificação do
armazém
• A existência dos registros está limitada à do MIDlet
que os criou
RMS - Métodos
•
static RecordStore openRecordStore(String nome, boolean criarSeNecessario);
•
void closeRecordStore();
•
void delete recordStore(String nome);
•
int addRecord(byte[] dados, int offset, int numBytes);
•
void setRecord(int recordId, byte[] novosDados, int offset, int numBytes);
•
byte[] getRecord(int recordId);
•
int getRecord(int recordId, byte[] buffer, int offset);
RMS – Métodos (Cont.)
• int getNumRecords();
• long getLastModified();
• String getName();
• addRecordListener(RecordListener listener);
• removeRecordListener(RecordListener listener);
RMS - Exemplo
...
RecordStore rs = null;
String nome = “Eduardo”;
...
try {
rs = RecordStore.openRecordStore( “meusdados", true );
byte[] recData = nome.getBytes();
rs.addRecord(recData, 0, recData.length); //Grava dados
...
//Recupera dados
String retorno = new String( rs.getRecord(1) );
} catch( Exception e ) {
// tratamento de exceção
}
RecordEnumeration
• Interface que fornece métodos de movimentação para
frente e para trás em registros
• Semelhante ao Iterator em J2SE
• Pode levar em conta filtros (para pesquisa) e/ou
comparadores (para ordenação)
• Ex: classificar registros em ordem alfabética
RecordEnumeration
• Métodos Principais
• RecordEnumerator enumerateRecords(RecordFilter filter,
RecordComparator comparator,
boolean keepUpdated); *
• byte nextRecord();
• byte previousRecord();
• Boolean hasNextElement();
• Boolean hasPreviousElement();
• Void keepUpdated(boolean keep);
* Método da classe RecordStore
Exemplo..
...
RecordEnumeration enum = re.enumerateRecords(null, null,
false);
while ( re.hasNextElement() ) {
//armazena o próximo registro em um String
String str = new String(re.nextRecord());
… processa algo…
}
…
RecordComparator
• Interface para comparação entre registros
• Método a ser implementado
• Int compare(byte[] rec1, byte[] rec2);
• Tipos de RecordComparator
• EQUIVALENT – rec1 é equivalente a rec2
• FOLLOWS – rec1 vem depois de rec2
• PRECEDES – rec1 vem antes de rec2
Exemplo...
public class Comparador implements RecordComparator {
public int compare(byte rec1, byte rec2) {
String str1 = new String(rec1);
String str2 = new String(rec2);
int resultado = str1.compareTo(str2);
if (resultado == 0)
return RecordComparator.EQUIVALENT;
else if (result < 0)
return RecordComparator.PRECEDES;
else
return RecordComparator.FOLLOWS;
}
}
Exemplo (Cont.)
...
//Cria um novo comparador para ordenar
Comparador comp = new Comparador();
//Referencia o comparador ao criar a enumeração
RecordEnumeration re = rs.enumerateRecords(null, comp, false);
//Itera nos registros, que já estarão ordenados
While ( re.hasPreviousElement ) {
...
String s = new String(re.previousRecord());
...
}
…
RecordFilter
• Interface para filtro de registros
• Apenas os resultados que correspondem ao
critério do filtro, farão parte do conjunto
enumerador
• Método a ser implementado
• boolean matches(byte[] candidate)
Exemplo...
class Filtro implements RecordFilter {
private String textoBuscado = null;
public Filtro(String textoBuscado) {
//este é o texto a ser pesquisado
this.textoBuscado = textoBuscado.toLowerCase();
}
public boolean matches(byte[] candidato) {
String str = new String(candidato).toLowerCase();
//procura uma correspondência
if ( textoBuscado != null && str.indexOf(textoBuscado) != -1 ) {
return true;
} else {
return false;
}
}
}
Exemplo (Cont.)
...
//Cria um novo filtro de busca
Filtro filtro = new Filtro(“Texto a ser buscado”);
//Referencia o filtro ao criar o enumerador
RecordEnumeration re = rs.enumerateRecords(filtro, null, false);
/*Se houver pelo menos um registro no conjunto de resultados, uma correspondência foi
encontrada*/
if (re.getNumRecords() > 0) {
//Manipula os resultados
}
…
RecordListener
• Notificação de que um registro foi adicionado,
removido ou atualizado
• Ex: Salvar preferências de um usuário
• Opera como os outros Receptores de eventos já
vistos em aula
• Métodos a serem implementados
• void recordAdded(RecordStore rs, int recordId);
• void recordChanged(RecordStore rs, int recordId);
• void recordDeleted(RecordStore rs, int recordId);
Exercício
• Implemente a persistencia de uma agenda.
Considere que cada elemento é composto de 3
Strings: Nome, Endereco e Telefone.
• Escreva filtros em cima da implementação
acima.
Referências
• Tutoriais da Sun
Download

Programa Expresso de Capacitação Módulo J2ME