Persistência em RMS

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.;
import javax.microedition.lcdui.
;

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…

Bom dia,

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

Um abraço

Thiago Moreira

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…

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();
			}

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:leoojas@gmail.com
Abraços …

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.

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!!!

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

Então… mais ou menos assim:

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

desculpa,mas o q seria esse cgFood?

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();

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

Eu uso o floggy, é EXCELENTE !!!

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 ???

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.