Persistência no emulador

Olá pessoal!

Estou desenvolvendo um programa em J2ME com persistência através do RecordStore. Para realizar a programação, estou utilizando o eclipse. O fato é que de uma hora para outra os dados começaram a ser perdidos e a cada vez que eu reinicializo o aplicativo o RecorStore inicia com 0 registros. Nas primeiras vezes que rodei estava funcionando e agora nada.

Será que é algum problema de configuração do eclipse?

Abraços a todos.

[quote=malfattirs]Olá pessoal!

Estou desenvolvendo um programa em J2ME com persistência através do RecordStore. Para realizar a programação, estou utilizando o eclipse. O fato é que de uma hora para outra os dados começaram a ser perdidos e a cada vez que eu reinicializo o aplicativo o RecorStore inicia com 0 registros. Nas primeiras vezes que rodei estava funcionando e agora nada.

Será que é algum problema de configuração do eclipse?

Abraços a todos.[/quote]

Posta o código que usa o RecordStore, aqui ninguém é adivinho.

Também aprender a se virar sem IDE ajuda nestes casos.

Olá mochuara!

Acho que você não entendeu minha pergunta. vou explicar! O problema não está no código, tanto é que no dispositivo funciona, o problema está nas conficurações do eclipse ou do emulador do J2ME que não está mais funcionando como deveria. Nas primeiras vezes que executei tudo funcionava normalmente, mas depois que inseri vários registros, passou a não funcionar mais.

Valeu a tentativa.

[quote=malfattirs]Olá mochuara!

Acho que você não entendeu minha pergunta. vou explicar! O problema não está no código, tanto é que no dispositivo funciona, o problema está nas conficurações do eclipse ou do emulador do J2ME que não está mais funcionando como deveria. Nas primeiras vezes que executei tudo funcionava normalmente, mas depois que inseri vários registros, passou a não funcionar mais.

Valeu a tentativa.

[/quote]

Isto aparentemente não faz sentido. Eu lembro que os dados do recordstore no emulador ficam armazenados no diretorio do wtk, verifique se tem permissão para escrita nesta pasta. Se não for isto provavelmente vc esta fazendo alguma coisa errada no código.

Bom, acho que o problema não é no código, mas aí vai:


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.TextBox;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.rms.RecordStore;


public class RespostaExercicio extends MIDlet implements CommandListener 
{
	//Atributos da classe
	private Display display = null;
	private Form formPrincipal = null, formInsere=null;
	private RecordStore recordStore = null;
	private Command sair = null;
	private Command leitura = null;
	private Command escrita = null;
	private Command voltar = null;
	private Command salvar = null;
	private TextBox formMostra = null;
	private TextField campoTexto = null;
	
	/***********************************************************
	*Nome: Exemplo3()
	*Descrição: construtor da classe
	*Parâmetros: Nenhum
	*Retorno: Nenhum
	************************************************************/
	public RespostaExercicio() 
	{
		//Obtem o display do dispositivo
		display = Display.getDisplay(this);
		
		//Cria os formulários
		formPrincipal = new Form("Persistencia");
		formInsere = new Form("Insercao");
		formMostra = new TextBox("Registros cadastrados","", 2000, TextField.ANY);
		
		//Cria os comandos da aplicação
		sair = new Command("Sair", Command.CANCEL, 0);
		leitura = new Command("Leitura", Command.SCREEN, 1);
		escrita = new Command("Escrita", Command.SCREEN, 1);
		voltar = new Command("Voltar", Command.SCREEN, 1);
		salvar = new Command("Salvar", Command.CANCEL, 0);
		
		//Adiciona os comandos aos formulários
		formPrincipal.addCommand(sair);
		formPrincipal.addCommand(escrita);
		formPrincipal.addCommand(leitura);
		formInsere.addCommand(voltar);
		formInsere.addCommand(salvar);
		formMostra.addCommand(voltar);
		
		//Cria o campo de texto
		campoTexto = new TextField("Nome","", 20, TextField.ANY);
		formInsere.append(campoTexto);
		
		//Registra o formulário no tratador de eventos
		formPrincipal.setCommandListener(this);	
		formInsere.setCommandListener(this);	
		formMostra.setCommandListener(this);	
	}

	
	/***********************************************************
	*Nome: destroyApp()
	*Descrição: método da classe MIDlet chamado quando a aplicação
	*           é finalizada
	*Parâmetros: Nenhum
	*Retorno: Nenhum
	************************************************************/
	protected void destroyApp(boolean arg0) 
	{
	}
	
	
	/***********************************************************
	*Nome: pauseApp()
	*Descrição: método da classe MIDlet chamado quando a aplicação
	*           é pausada
	*Parâmetros: Nenhum
	*Retorno: Nenhum
	************************************************************/
	protected void pauseApp() 
	{
	}

	
	/***********************************************************
	*Nome: startApp()
	*Descrição: método da classe MIDlet chamado quando a aplicação
	*           é iniciada
	*Parâmetros: Nenhum
	*Retorno: Nenhum
	************************************************************/
	protected void startApp()
	{
		//Configura o formulario para ser apresentado na tela
		display.setCurrent(formPrincipal);
		
		//Realiza a abertura do RecordStore
		abreRecordStore();
	}
	
	
	/***********************************************************
	*Nome: abreRecordStore()
	*Descrição: método que abre o armazem de dados
	*Parâmetros: Nenhum
	*Retorno: Nenhum
	************************************************************/
	public void abreRecordStore()
	{
		//Abre o RecordStore para armazenamento
		try
		{
			recordStore = RecordStore.openRecordStore("teste", true);
			System.out.println(recordStore.getSizeAvailable());
			System.out.println("RecordStore aberto");
		}
		catch(Exception e)
		{
			destroyApp(true);
			this.notifyDestroyed();
		}
	}
	
	
	/***********************************************************
	*Nome: fechaRecordStore()
	*Descrição: método que fecha o armazem de dados
	*Parâmetros: Nenhum
	*Retorno: Nenhum
	************************************************************/
	public void fechaRecordStore()
	{
		//Fecha o RecordStore
		try
		{
			recordStore.closeRecordStore();
			System.out.println("RecordStore fechado");
		}
		catch(Exception e)
		{
			destroyApp(true);
			this.notifyDestroyed();
		}
	}
	
	/***********************************************************
	*Nome: escreveDados
	*Descrição: insere dados do formulário no RecordStore
	*Parâmetros: Nenhum
	*Retorno: Nenhum
	************************************************************/
	public void escreveDados()
	{
		if (campoTexto.getString().compareTo("")!=0)
		{
			try
			{
				ByteArrayOutputStream ba = new ByteArrayOutputStream();
				DataOutputStream ds = new DataOutputStream(ba);
				ds.writeUTF(campoTexto.getString());
				ds.writeInt(recordStore.getNumRecords()+1);
				byte[] dados = ba.toByteArray();
				recordStore.addRecord(dados, 0, dados.length);
				ds.close();
				ba.close();
			}
			catch(Exception e)
			{
				
			}
		}
	}
	
	/***********************************************************
	*Nome: mostraDados
	*Descrição: mostra os dados de um RecordStore em um TextBox
	*Parâmetros: Nenhum
	*Retorno: Nenhum
	************************************************************/
	public void mostraDados()
	{
		try
		{
			formMostra.setString("");
			
			for (int iIndex=recordStore.getNumRecords(); iIndex>=1; iIndex--)
			{
				byte[] dados = recordStore.getRecord(iIndex);
				ByteArrayInputStream ba = new ByteArrayInputStream(dados);
				DataInputStream ds = new DataInputStream(ba);
				String nome = ds.readUTF();
				int recordId = ds.readInt();
	
				formMostra.insert("Nome: "+nome+"\nId: "+recordId+"\n\n", 0);
				
				ds.close();
				ba.close();
			}
		}
		catch(Exception e)
		{
				
		}
	}
	
	/***********************************************************
	*Nome: commandAction()
	*Descrição: método da interface CommandListener responsável
	*           pelo tratamento de eventos
	*Parâmetros: Command, Displayable
	*Retorno: Nenhum
	************************************************************/
	public void commandAction(Command command, Displayable disp)
	{
		if (command == salvar)
		{
			escreveDados();
			campoTexto.setString("");
		}
		else if (command == leitura)
		{
			display.setCurrent(formMostra);
			mostraDados();
		}
		else if (command == escrita)
		{
			campoTexto.setString("");
			display.setCurrent(formInsere);
		}
		else if (command == voltar)
		{
			display.setCurrent(formPrincipal);
		}
		else if (command == sair)
		{
			fechaRecordStore();
			destroyApp(true);
			notifyDestroyed();
		}
	}
}


Para quem se deparar com o mesmo problema, aqui está a solução:

http://osdir.com/ml/ide.eclipse.eclipseme.user/2007-11/msg00024.html

Eu falei que o problema não estava no maldito código :wink:

[quote=malfattirs]Para quem se deparar com o mesmo problema, aqui está a solução:

http://osdir.com/ml/ide.eclipse.eclipseme.user/2007-11/msg00024.html

Eu falei que o problema não estava no maldito código :wink:[/quote]

Descobriu o problema sem capturar uma exceção sequer?