Jump to content
Nokioteca Forum

[j2me] Salvataggio E Recupero Dati Su Recordstore


GuglielmoS
 Share

Recommended Posts

Ciao a tutti e scusate se rompo ancora, ma non riesco proprio a capire per quale motivo ci sia questa eccezione, la quale mi indica che l'indice passatogli non è valido.

Adesso il codice non sarà ottimizzato e dovrò migliorarlo, però teoricamente dovrebbe riuscire a salvarmi e a leggermi dal RecordStore che gli ho definito(anche quando richiamo il metodo RecordStore.openRecordStore, il secondo parametro è a true per indicargli di creare il RS se non esiste).

Il problema si presenta quindi quando a clickare sul comando salva della midlet.

Codice della MIDlet:

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.Date;

public class MoneyMidlet extends MIDlet implements CommandListener {

// Componenti Grafici
private Display display;
private Form formPrincipale;
private Command cmdExit;
private Command cmdSave;
private StringItem strDataInizio;
private StringItem credits;
private TextField txtMoneteDa2;
private TextField txtMoneteDa1;
private TextField txtMoneteDa50;
// Componenti per i dati
private Money monete;

public MoneyMidlet() {
	display = Display.getDisplay(this);
	// Istanzio i vari oggetti del form
	formPrincipale = new Form("MyMoney - Gestione Monete");
	cmdExit = new Command("Esci", Command.EXIT, 1);
	cmdSave = new Command("Salva", Command.OK, 2);
	txtMoneteDa2 = new TextField("Monete Da 2:", null, 5, TextField.NUMERIC);
	txtMoneteDa1 = new TextField("Monete Da 1:", null, 5, TextField.NUMERIC);
	txtMoneteDa50 = new TextField("Monete Da 50:", null, 5, TextField.NUMERIC);
	strDataInizio = new StringItem("Data Inizio Raccolta: ", "");
	credits = new StringItem("Autore del Programma:", "GuglielmoS");

	// Istanzio l'oggetto per la gestione dei dati
	monete = new Money();

	// Se è la prima volta che viene avviata la midlet setto tutto a 0
	if (monete.isFirstTime()) {
		strDataInizio.setText(new Date().toString());
		txtMoneteDa2.setString("0");
		txtMoneteDa1.setString("0");
		txtMoneteDa50.setString("0");
	} else {
		loadFromRS();
	}
}

public void loadFromRS() {
	strDataInizio.setText(monete.getDataInizioRaccolta());
	txtMoneteDa2.setString(Integer.toString(monete.getMoneteDa2()));
	txtMoneteDa1.setString(Integer.toString(monete.getMoneteDa1()));
	txtMoneteDa50.setString(Integer.toString(monete.getMoneteDa50()));
}

protected void startApp() throws MIDletStateChangeException {
	// Aggiungo al form i vari componenti
	formPrincipale.append(credits);
	formPrincipale.append(strDataInizio);
	formPrincipale.append(txtMoneteDa2);
	formPrincipale.append(txtMoneteDa1);
	formPrincipale.append(txtMoneteDa50);
	formPrincipale.addCommand(cmdExit);
	formPrincipale.addCommand(cmdSave);
	formPrincipale.setCommandListener(this);

	// Setto formPrincipale sul display
	display.setCurrent(formPrincipale);
}

protected void pauseApp() {
	notifyPaused();
}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {}

public void commandAction(Command c, Displayable arg1) {
	if (c == cmdExit) {
		notifyDestroyed();
	} else if (c == cmdSave) {
		monete.setDataInizioRaccolta(strDataInizio.getText());
		monete.setMoneteDa2(Integer.parseInt(txtMoneteDa2.getString()));
		monete.setMoneteDa1(Integer.parseInt(txtMoneteDa1.getString()));
		monete.setMoneteDa50(Integer.parseInt(txtMoneteDa50.getString()));
		monete.saveToRS();
	}
}
}

Classe utilizzata nella MIDlet:

import javax.microedition.rms.*;

public class Money {

private RecordStore dataBase;
final static private String DBNAME = "mymoney_db";
private int nMonete2;
private int nMonete1;
private int nMonete50;
private String dataInizioRaccolta;
private boolean firstTime;
private byte[] buff1 = new byte[10];
private byte[] buff2 = new byte[5];
private byte[] buff3 = new byte[5];
private byte[] buff4 = new byte[5];

public Money() {
	firstTime = true;

	// Tento di aprire il record store
	try {
		dataBase = RecordStore.openRecordStore(DBNAME, true);
	} catch (RecordStoreException rse) {
		rse.printStackTrace();
	}

	// Leggo la quantità di monete e la data di inzio
	try {

		if (dataBase.getNumRecords() > 0) {
			try {
				dataBase.getRecord(0, buff1, 0);
				dataInizioRaccolta = new String(buff1);
				dataBase.getRecord(1, buff2, 0);
				nMonete2 = Integer.parseInt(new String(buff2));
				dataBase.getRecord(2, buff3, 0);
				nMonete1 = Integer.parseInt(new String(buff3));
				dataBase.getRecord(3, buff4, 0);
				nMonete50 = Integer.parseInt((new String(buff4)));
				dataBase.closeRecordStore();
			} catch (RecordStoreNotOpenException e) {
				e.printStackTrace();
			} catch (InvalidRecordIDException e) {
				e.printStackTrace();
			} catch (RecordStoreException e) {
				e.printStackTrace();
			}
			firstTime = false;
		}
	} catch (RecordStoreNotOpenException e) {
		e.printStackTrace();
	}
}

// Metodi GETTER
public int getMoneteDa2() { return nMonete2; }
public int getMoneteDa1() { return nMonete1; }
public int getMoneteDa50() { return nMonete50; }
public String getDataInizioRaccolta() { return dataInizioRaccolta; }

/**
 * @return true se è la prima volta che viene avviata la midlet, false altrimenti
 */
public boolean isFirstTime() { return firstTime; }

// Metodi SETTER
public void setDataInizioRaccolta(String dataInizioRaccolta) {
	this.dataInizioRaccolta = dataInizioRaccolta;
}
public void setMoneteDa2(int moneteDa2) { nMonete2 = moneteDa2; }
public void setMoneteDa1(int moneteDa1) { nMonete1 = moneteDa1; }
public void setMoneteDa50(int moneteDa50) { nMonete50 = moneteDa50; }


public void saveToRS() {
	// Tento di aprire il record store
	try {
		dataBase = RecordStore.openRecordStore(DBNAME, true);
	} catch (RecordStoreException rse) {
		rse.printStackTrace();
	}

	if (dataBase != null) {
		buff1 = dataInizioRaccolta.getBytes();
		buff2 = (Integer.toString(nMonete2)).getBytes();
		buff3 = (Integer.toString(nMonete1)).getBytes();
		buff4 = (Integer.toString(nMonete50)).getBytes();

		// Tento di scrivere nel record store
		try {
			dataBase.setRecord(0, buff1, 0, buff1.length);
			dataBase.setRecord(1, buff2, 0, buff2.length);
			dataBase.setRecord(2, buff3, 0, buff3.length);
			dataBase.setRecord(3, buff4, 0, buff4.length);
			dataBase.closeRecordStore();
		} catch (InvalidRecordIDException e) {
			e.printStackTrace();
		} catch (RecordStoreNotOpenException e) {
			e.printStackTrace();
		} catch (RecordStoreFullException e) {
			e.printStackTrace();
		} catch (RecordStoreException e) {
			e.printStackTrace();
		}
	}
}
}

Eccezione:

javax.microedition.rms.InvalidRecordIDException
at javax.microedition.rms.RecordStore.findRecord(+18)
at javax.microedition.rms.RecordStore.setRecord(+56)
at Money.saveToRS(+96)
at MoneyMidlet.commandAction(+95)
at javax.microedition.lcdui.Display$DisplayAccessor.commandAction(+282)
at javax.microedition.lcdui.Display$DisplayManagerImpl.commandAction(+10)
at com.sun.midp.lcdui.DefaultEventHandler.commandEvent(+68)
at com.sun.midp.lcdui.AutomatedEventHandler.commandEvent(+47)
at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.handleVmEvent(+186)
at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.run(+57)

Link to comment
Condividi su altri siti

  • 11 mesi dopo...

Prova così...... :)

import javax.microedition.rms.*;

public class Money {

       private RecordStore dataBase;
       final static private String DBNAME = "mymoney_db";
       private int nMonete2;
       private int nMonete1;
       private int nMonete50;
       private String dataInizioRaccolta;
       private boolean firstTime;
       private byte[] buff1 = new byte[35]; // può occupare piu dei 15 previsti
       private byte[] buff2 = new byte[5];
       private byte[] buff3 = new byte[5];
       private byte[] buff4 = new byte[5];

       public Money() {
               firstTime = true;

               // Tento di aprire il record store
               try {
                       dataBase = RecordStore.openRecordStore(DBNAME, true);
               } catch (RecordStoreException rse) {
                       rse.printStackTrace();
               }

               // Leggo la quantità di monete e la data di inzio
               try {
                       int len;
                       if (dataBase.getNumRecords() > 0) {
                               try {
                                       dataBase.getRecord(1, buff1, 0);
                                       dataInizioRaccolta = new String(buff1);
                                       len=dataBase.getRecord(2, buff2, 0);
                                       nMonete2 = Integer.parseInt(new String(buff2,0,len));
                                       len=dataBase.getRecord(3, buff3, 0);
                                       nMonete1 = Integer.parseInt(new String(buff3,0,len));
                                       len=dataBase.getRecord(4, buff4, 0);
                                       nMonete50 = Integer.parseInt((new String(buff4,0,len)));
                                       dataBase.closeRecordStore();
                               } catch (RecordStoreNotOpenException e) {
                                       e.printStackTrace();
                               } catch (InvalidRecordIDException e) {
                                       e.printStackTrace();
                               } catch (RecordStoreException e) {
                                       e.printStackTrace();
                               }
                               firstTime = false;
                       }
               } catch (RecordStoreNotOpenException e) {
                       e.printStackTrace();
               }
       }

       // Metodi GETTER
       public int getMoneteDa2() { return nMonete2; }
       public int getMoneteDa1() { return nMonete1; }
       public int getMoneteDa50() { return nMonete50; }
       public String getDataInizioRaccolta() { return dataInizioRaccolta; }

       /**
        * @return true se è la prima volta che viene avviata la midlet, false altrimenti
        */
       public boolean isFirstTime() { return firstTime; }

       // Metodi SETTER
       public void setDataInizioRaccolta(String dataInizioRaccolta) {
               this.dataInizioRaccolta = dataInizioRaccolta;
       }
       public void setMoneteDa2(int moneteDa2) { nMonete2 = moneteDa2; }
       public void setMoneteDa1(int moneteDa1) { nMonete1 = moneteDa1; }
       public void setMoneteDa50(int moneteDa50) { nMonete50 = moneteDa50; }


       public void saveToRS() 
       {
               // Tento di aprire il record store
               try {
                       dataBase = RecordStore.openRecordStore(DBNAME, true);
               } catch (RecordStoreException rse) {
                       rse.printStackTrace();
               }

               if (dataBase != null) {
                      buff1 = dataInizioRaccolta.getBytes();
                      buff2 = (Integer.toString(nMonete2)).getBytes();
                      buff3 = (Integer.toString(nMonete1)).getBytes();
                      buff4 = (Integer.toString(nMonete50)).getBytes();

                       // Tento di scrivere nel record store
                       try {
                               if (dataBase.getNumRecords() > 0)
                               {        
                                  dataBase.setRecord(1, buff1, 0, buff1.length);
                                  dataBase.setRecord(2, buff2, 0, buff2.length);
                                  dataBase.setRecord(3, buff3, 0, buff3.length);
                                  dataBase.setRecord(4, buff4, 0, buff4.length); 
                               }
                               else
                               {
                                  dataBase.addRecord(buff1, 0, buff1.length);
                                  dataBase.addRecord(buff2, 0, buff2.length);
                                  dataBase.addRecord(buff3, 0, buff3.length);
                                  dataBase.addRecord(buff4, 0, buff4.length);
                               }
                               dataBase.closeRecordStore();
                       } catch ( InvalidRecordIDException e) {
                               e.printStackTrace();
                       } catch (RecordStoreNotOpenException e) {
                               e.printStackTrace();
                       } catch (RecordStoreFullException e) {
                               e.printStackTrace();
                       } catch (RecordStoreException e) {
                               e.printStackTrace();
                       }
               }

       }
}

Link to comment
Condividi su altri siti

Please sign in to comment

You will be able to leave a comment after signing in



Accedi Ora
 Share

×
×
  • Crea Nuovo...

Informazione Importante

Questo sito utilizza i cookie per analisi, contenuti personalizzati e pubblicità. Continuando la navigazione, accetti l'utilizzo dei cookie da parte nostra | Privacy Policy