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