Un'interfaccia più efficiente, per accedere ad una lista di record presenti in memoria, è l'interfaccia RecordEnumeration
:
Listato 10. Interfaccia per accedere a una lista di record
..//
RecordStore rs = RecordStore.openRecordStore("my_rms", true);
RecordEnumeration re = rs.enumerateRecords(null, null, false);
while (re.hasNextElement())
{
String s = new String(re.nextRecord());
}
//..
I due parametri null, nella chiamata di enumerateRecords
, fanno sì che, nell'enumeration, vengano ritornati tutti i record (senza filtro quindi) e senza un ordinamento (non è effettuata comparazione).
Il terzo parametro, false, significa che l'enumeration non deve tenere traccia degli eventuali cambiamenti che possono intervenire nel frattempo nel RecordStore a causa di add o delete.
Per muoversi nel RecordEnumeration e analizzare i record, si possono utilizzare i metodi nextRecord()
per avanzare e previousRecord()
per tornare indietro.
Implementare un Comparator
Vediamo come si può ottenere la lista dei nostri record (in questo caso consideriamo delle semplici stringhe) in modo che queste risultino ordinate in senso alfabetico:
Listato 11. Implementazione interfaccia RecordComparator
public class StringComparator implements RecordComparator
{
public int compare(byte[] b1, byte[] b2)
{
String s1 = new String(b1);
String s2 = new String(b2);
int r = s1.compareTo(s2);
if (r == 0)
{
return RecordComparator.EQUIVALENT;
}
else if (r < 0)
{
return RecordComparator.PRECEDES;
}
else
{
return RecordComparator.FOLLOWS;
}
}
}
Supponendo di avere un RS, nel quale sono memorizzate una serie di stringhe, il codice che ci permette di navigare una lista di record ordinata secondo ordine alfabetico sarà:
Listato 12. Navigare una lista in ordine alfabetico
..//
StringComparator comp = new StringComparator();
RecordEnumeration re = rs.enumerateRecords(null, comp, false);
while (re.hasNextElement())
{
String s = new String(re.nextRecord());
.......
}
//..
Filtrare i record: RecordFilter
I record possono anche essere filtrati secondo precisi criteri. Supponiamo di dover caricare la lista dei record che iniziano con la lettera A e che risultino ordinati con l'ipotesi del paragrafo precedente.
Listato 13. Implementazione interfaccia RecordFilter
public class StringFilter implements RecordFilter
{
private String initialLetter = null;
public StringFilter(String initialLetter)
{
super();
this.initialLetter = initialLetter;
}
public boolean matches(byte[] recordByte)
{
String record = new String(recordByte).toUpperCase();
initialLetter = initialLetter.toUpperCase();
if (initialLetter != null && record.startsWith(initialLetter))
{
return true;
}
else
{
return false;
}
}
}
Utilizziamo l'oggetto creato insieme al comparator visto precedentemente:
Listato 14. Filtra record che iniziano per A e li mette in ordine alfabetico
..//
StringComparator comp = new StringComparator();
StringFilter filter = new StringFilter("A");
RecordEnumeration re = rs.enumerateRecords(filter, comp, false);
while (re.hasNextElement())
{
String s = new String(re.nextRecord());
......
}
//..
In questo modo otteniamo una lista di stringhe memorizzate che iniziano con A e sono presentate in ordine alfabetico.
Gli oggetti, che implementano le due interfacce, di comparazione e filtraggio, possono essere complicati in modo da gestire Record Store in cui sono memorizzati dati più complessi di semplici stringhe.
Catturare gli eventi: il RecordListener
Su un Record Store è possibile settare un listener che può essere usato per intercettare eventi come l'aggiunta, la cancellazione e la modifica dei record.
Listato 15. oggetto che implementa l'interfaccia RecordListener
public class RecordListenerImpl implements RecordListener
{
public void recordAdded(RecordStore rs, int i)
{
System.out.println("E' stato aggiunto il record di indice "+i);
}
public void recordChanged(RecordStore rs, int i)
{
System.out.println("E' stato modificato il record di indice "+i);
}
public void recordDeleted(RecordStore rs, int i)
{
System.out.println("E' stato cancellato il record di indice "+i);
}
}
e settarlo, come listener del Record Store, nel seguente modo:
RecordStore rs = RecordStore.openRecordStore("my_rms", true);
rs.addRecordListener(new RecordListenerImpl());
A questo punto, ogni volta che si esegue un'operazione di aggiunta, modifica o cancellazione di record nel RS, vediamo tracciato nella console del WTK il messaggio relativo all'azione completata.