Nokioteca [Nokia] Forum: [j2me] Salvataggio E Recupero Dati Su Recordstore - Nokioteca [Nokia] Forum

Salta al contenuto

Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione

[j2me] Salvataggio E Recupero Dati Su Recordstore

#1 L   GuglielmoS 

  • Newbie
  • Punto
  • Gruppo: Utente
  • Messaggi: 7
  • Iscritto: 10 agosto 2009
  • Cellulare:6220c

Inviato 03 novembre 2009 - 16:47

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)

0

#2 L   Traal 

  • Member
  • PuntoPunto
  • Gruppo: Utente
  • Messaggi: 24
  • Iscritto: 19 aprile 2010
  • Località:Torino
  • Cellulare:Nokia n70
  • Firmware:V 5.0717.3.0.1

Inviato 30 ottobre 2010 - 16:54

UP!
Mi interessa anche a me =)
0

#3 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 31 ottobre 2010 - 11:01

Visualizza MessaggiGuglielmoS, il 03 novembre 2009 - 16:47, ha scritto:


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

0

Condividi questa discussione:


Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione