Persistência em RMS

14 respostas
L

galera bom dia a todos?
Estou com uma enorme dificuldade de entender a persistência em J2Me,pois faltei a aula de persistência na faculdade…estou com esse código abaixo,sem saber como Alterar,excluir e consultar.gostaria da ajuda de vocês para implementação.

import javax.microedition.midlet.MIDlet;

import javax.microedition.midlet.MIDletStateChangeException;

import javax.microedition.rms.<em>;

import javax.microedition.lcdui.</em>;

public class Agenda extends MIDlet implements CommandListener {

private Display tela;
private Form form;
private TextField nome, tel;
private Command sair, cadastrar, listar, alterar, excluir, consultar;
private RecordStore rs;

public Agenda() {}
public void destroyApp(boolean b) throws MIDletStateChangeException {}
public void pauseApp() {}
public void startApp() throws MIDletStateChangeException {

	tela = Display.getDisplay(this);
	form = new Form ("Agenda");
	nome = new TextField("Nome:","",20,TextField.ANY);
	tel = new TextField ("Tel:", "", 11, TextField.ANY);
	
	sair = new Command("Sair",Command.EXIT,1);
	cadastrar = new Command ("Cadastrar", Command.SCREEN,1);
	listar = new Command ("listar", Command.SCREEN,1);
	alterar = new Command("Alterar", Command.SCREEN,1);
	excluir = new Command ("Excluir", Command.SCREEN,1);
	consultar = new Command ("Consultar", Command.SCREEN,1);
	
	form.append(nome);
	form.append(tel);
	form.addCommand(sair);
	form.addCommand(cadastrar);
	form.addCommand(listar);
	form.addCommand(alterar);
	form.addCommand(excluir);
	form.addCommand(consultar);
	
	form.setCommandListener(this);
	tela.setCurrent(form);
}

public void commandAction(Command C, Displayable D) {
	
	if (C==sair){
		notifyDestroyed();
	}
	
	if (C==cadastrar){
		
		try{
			rs=RecordStore.openRecordStore("Agenda", true);// o true,serve para criar o arquivo caso ele não exista.
			byte[]bnome = (nome.getString()).getBytes();
			byte[]btel = (tel.getString()).getBytes();
			
			rs.addRecord(bnome, 0, bnome.length);
			rs.addRecord(btel, 0, btel.length);
			
			Alert mensagem =new Alert("Agenda 2008","Cliente inserido com sucesso",null,null);
			mensagem.setTimeout(2000);
			tela.setCurrent(mensagem);
			
			rs.closeRecordStore();
		
		}catch (Exception e){}
	}
	
	if (C==listar){
		String aux="";
		
		try{
			rs=RecordStore.openRecordStore("Agenda", true);
			
			try{
			for (int i=1;i<rs.getNextRecordID();i+=2)
			{//i+=2: identifica os dois campos da tela, de dois em dois. rsrs
				
				
				String snome = new String (rs.getRecord(i));
				String stel = new String (rs.getRecord(i+1));
				aux = aux+"Nome:"+snome+ " Tel:"+stel+"\n";
			}

			}catch(Exception e){}
			
			Alert msg = new Alert("Lista",aux,null, AlertType.INFO);
			msg.setTimeout(3000);
			tela.setCurrent(msg);
		}	
	catch(Exception e){
		}
	}

	if(C==Alterar){}
            if(C==Excluir){}
            if(C==Consultar){}

Valeu obrigado galera…

14 Respostas

tmoreira2020

Bom dia,

Você já pensou em utilizar o Floggy para gerenciar a persistència dos seus dados?

Um abraço

Thiago Moreira

L

Gostaria de saber como q faço o excluir com rms,pegando os dados do campo nome e tel e comparando com o q tá no registro…

agogear

Ola.

Olha so, RMS é bem simples, mas eu recomendo que voce leia antes o conteúdo antes de tentar entender o codigo.
RecordStore é um array de bytes identificado por um indice.

Voce sempre acessa ele atraves do metodo openRecordStore… e de acordo com os parametros voce diz para abrir um existente ou criar um novo caso nao exista ainda.
Voce tem vários metodos para manipular o recordstore (RS). addRecord, remove, etc…

Para varrer o array e encontrar seus registros, voce precisa utilizar RecordEnumeration.

Dei um minicurso a cerca de 15 dias e coloquei alguns slides bem simples sobre RMS. Espero que ajude voce em algo.
http://sites.google.com/site/eaoufpe/downloads/J2ME.pdf?attredirects=0 (link para download)

Exemplo pra te ajudar:

//cria o rs e insere algo

RecordStore rs = RecordStore.openRecordStore(RECORD_STORE_NAME, true);

byte[] notaByte = tfResult.getString().getBytes();

rs.addRecord(notaByte, 0, notaByte.length);

rs.closeRecordStore();

//para recuperar:

try {

rs = RecordStore.openRecordStore(RECORD_STORE_NAME, false);

re = rs.enumerateRecords(null, null, true);

} catch (RecordStoreFullException e) {

e.printStackTrace();

} catch (RecordStoreNotFoundException e) {

e.printStackTrace();

} catch (RecordStoreException e) {

e.printStackTrace();

}
while(re.hasNextElement()){
			try {
				value = rs.getRecord(re.nextRecordId());
				finalValue = new String(value);
				System.out.println(finalValue);
                                                           } catch (InvalidRecordIDException e) {
				e.printStackTrace();
			} catch (RecordStoreNotOpenException e) {
				e.printStackTrace();
			} catch (RecordStoreException e) {
				e.printStackTrace();
			}
L

Poxa Amigo muitíssimo obrigado pelo material e pela explicação,nesse exato momento q estou vendo sua resposta,vou ver agora mesmo se consegui mesmo entender,pois vou ter uma prova de j2me(que vai cair rms e socket),se vc tiver material de socket poderia enviar pra mim por favor,te agradeceria e muito…
email:[email removido]
Abraços …

L

ola amigo,minha dúvida eh o seguinte:estou com vários registros na minha coleção de registro,eu tenho dois campos para serem preenchidos na tela,campo nome e endereço,mas gostaria de consultar no registro o nome que digitei na tela…ai como utilizaria o metodo buscando pelo id,se não sei o id.

diogofabri

Você pegará o ID através do NextRecordId ou PreviousRecordId.
São metodos referenciados pelo RecordStore.

Uma ideia bacana seria você utilizar EnumerationRecord para buscar ou enumerar os registros existentes.

Uma outra dica seria voce adquirir o livro Core J2ME, que explica muito bem esse mecanismo de persistencia, ou entao em alguns topicos recentes você pode encontrar assuntos relacionados.

Abraço!!!

L

como q eu faço a persistência de um ChoiceGroup excluivo para um Registro rms ?

diogofabri

Então… mais ou menos assim:

Dessa forma vc pegará a String do ChoiceGroup que está selecionado!!!

L

desculpa,mas o q seria esse cgFood?

L

Ah ta entendi …agora como eu tenho q colocar num array de byte,tenho q converter de String para byte,então fiz isso aki:
byte bcurso[] = curso.getSring(curso.getSelectedIndex()).getBytes();

diogofabri

Ue…mas pra que você pegaria somente os bytes?

J

Eu uso o floggy, é EXCELENTE !!!

L

na caixa de selecao exclusiva eu pego a String do curso e converto ele para byte…pra dentro do array do Registro …q não é de bytes ???

diogofabri

Isso mesmo. Aconselho que essa conversão seja feita quando o registro for ser escrito no recordStore.
um exemplo:

public RecordStore rs;
         rs = RecordStore.openRecordStore("RecordData", true);

         ByteArrayOutputStream strmBytes = new ByteArrayOutputStream();			    
	 DataOutputStream strmDataType = new DataOutputStream(strmBytes);
         byte[] record;

         strmDataType.writeUTF("STRING");
         
         record = strmBytes.toByteArray();
	 rs.addRecord(record,0,record.length);
		    	
	 strmBytes.reset();//Inicia a escrita no começo do array interno
			    
	strmBytes.close();
	strmDataType.close();

O resultado deve ser o mesmo, mas seria uma outra ideia para que você posssa manuzear seu programa.
Abraço.

Criado 19 de novembro de 2008
Ultima resposta 1 de dez. de 2008
Respostas 14
Participantes 5