Per salvare dati in locale nelle applicazioni J2ME, le API standard (quindi senza considerare altri package opzionali), mettono a disposizione il Record Management System (RMS).
L'RMS può essere organizzato in "database" (Record Store), identificati ciascuno da un proprio nome e costituiti da insiemi di record caratterizzati da un id e da un array di bytes che ne rappresentano i dati.
Introduciamo in questa lezione il concetto di Midlet Suite che si può definire come un insieme di midlet, raggruppate in un unico jar, che hanno funzionalità diverse e che possono condividere, ad esempio, uno o più Record Store.
Dalla versione MIDP 2.0 i Record Store possono essere condivisi, sotto opportune condizioni, anche da midlet appartenenti a Midlet Suite differenti.
Scrivere dati in un Record Store
La classe principale, per gestire la persistenza in memoria, è l'oggetto RecordStore.
Le prime operazioni, per poter scrivere dati in un Record Store, sono quelle di crearlo ed aprirlo; questo può essere fatto con l'istruzione:
RecordStore rs = RecordStore.openRecordStore("my_rms", true);
Con il codice appena scritto si è aperto un RS di nome "my_rms", creandolo nel caso non esistesse (grazie al secondo parametro boolean settato a true).
Per scrivere un record (supponiamo una stringa) si usa il metodo addRecord
nel seguente modo:
Listato 8. Scrivere un record (Vedi codice completo)
public void writeString(String s)
{
byte[] b = s.getBytes();
try
{
RecordStore rs = RecordStore.openRecordStore("my_rms", true);
if (rs != null)
{
rs.addRecord(b, 0, b.length);
rs.closeRecordStore();
}
}
..//
A questo punto, nella nostra memoria, abbiamo salvato la stringa s sotto forma di array di byte con id uguale a 1.
Se salviamo altri dati, di seguito a questo, l'id di ciascun record si incrementa di uno.
L'istruzione closeRecordStore
chiude l'accesso al record store che non può essere utilizzato per nessun'altra operazione fino ad una nuova apertura.
Leggere i dati dal Record Store
Se dobbiamo recuperare il dato, salvato con id 1, possiamo usare il metodo seguente:
Listato 9. Recuperare i dati (Vedi codice completo)
public String readString()
{
String s = "";
byte[] b = new byte[100];
RecordStore rs = openRS();
if (rs != null)
{
try
{
rs.getRecord(1, b, 0);
s = new String(b);
rs.closeRecordStore();
}
..//
Come si può vedere, abbiamo bisogno di leggere il record attraverso il metodo getRecord()
che accetta come parametri:
- l'id del record che devo leggere;
- l'array di byte dove devo salvare i dati letti;
- l'offset da considerare per la scrittura nell'array di byte.
Il buffer viene poi usato per creare la stringa del risultato.
Cancellare un record e altre operazioni
La cancellazione avviene con il metodo deleteRecord(int i)
che accetta come parametro l'id che identifica il record. Anche questo metodo deve essere invocato dopo aver aperto RS.
La classe RecordStore
mette a disposizione altri metodi per la gestione della persistenza locale tra cui:
deleteRecordStore
– Permette di cancellare un RecordStore passandone il nome come parametro;listRecordStore
– Ritorna la lista dei Record Store della Midlet Suite;getRecordSize
– Ritorna la dimensione del record di indice i (passato come parametro);getNumRecords
– Ritorna il numero dei record in un RS;getLastModified
– La data dell'ultima modifica subita dal RS (in millisecondi a partire dall'1 Gennaio 1970);getSize
– L'occupazione di memoria del RS.