RMS: persistencia en J2ME.
Estos articulos que estoy escribiendo sobre J2ME, tienen el proposito de explicar algunos conceptos muy basicos que generalmente no se explican en los miles de tutoriales que existen en la red. Voy a tratar de ser muy directo y explicito, sin adentrarme tanto en teoria y cosas similares, espero que te ayude, sobre todo si ya has tenido cierta experiencia con esta tecnologia.
Otros articulos de J2ME:
RMS: persistencia en J2ME implementacion.
J2ME El manejo de los MIDlets.
Este articulo explicara como hacer consultas a los Record Management System (RMS) usando ciertos criterios (recuerden el comando SELECT de SQL). Para hacer este tipo de consultas, J2ME utiliza dos interfases, y una clase Enumeration (esta clase se obtiene a traves de un metodo de la clase RecordStore):
- RecordComparator
- RecordFilter
- RecordEnumeration
RecordComparator
Interface que define las reglas para ordenar los registros al momento de consultar el RMS.
RecordFilter
Interface que define las reglas para filtrar los registros que se desean del RMS
RecordEnumeration
Es un arreglo que se obtiene al consultar el RMS, con el metodo enumerateRecords de la clase RecordStore. El metodo enumerateRecords utiliza las interfaces RecordComparator y RecordEnumeration para consultar los RMS y obtener una lista de los registros.
En el siguiente codigo las clases Comparator y Filter no estan implementando los metodos para su funcion, solo es para ejemplificar:
public int compare(byte[] record1, byte[] record2){
}
}
class Filter implements RecordFilter {
public boolean matches(byte [] record) {
}
}
public void getData(Filter filter, Comparator comparator){
try {
RecordEnumeration enumeration = rs.enumerateRecords( filter, comparator, false);
while (enumeration.hasNextElement()){
byte [] record = enumeration.nextRecord();
ByteArrayInputStream bais = new ByteArrayInputStream(record);
DataInputStream dis = new DataInputStream(bais);
String name = dis.readUTF();
String address = dis.readUTF();
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
La linea en donde se crea la instancia del objeto enumeration se puede implementar de cuatro maneras respecto a las clases Comparator y Filter:
filtrara y ordenara los registros.
ordenara los registros.
filtrara los registros.
retornara con todos los registros
Nota: El valor booleano de los parametros de enumerateRecords indica, dependiendo de su valor:
true: Se actualizara el objeto enumeration al momento de existir algun cambio en el RMS. Se debe de tener cuidado con este comportamiento, ya que en ocasiones se puede alentar la aplicacion.
false: No habra ningun cambio.
Imaginemos que tenemos en el RMS la siguiente informacion (todos los datos son string):
ID Año Modelo Tipo Escala S24_2766 1949 Jaguar XK 120 Classic Cars 1:24 S24_2887 1952 Citroen-15CV Classic Cars 1:24 S24_4620 1961 Chevrolet Impala Classic Cars 1:18 S24_3432 2002 Chevy Corvette Classic Cars 1:24 S18_3782 1957 Vespa GS150 Motorcycles 1:18 S24_2000 1960 BSA Gold Star DBD34 Motorcycles 1:24 S32_4485 1974 Ducati 350 Mk3 Desmo Motorcycles 1:32 S32_2206 1982 Ducati 996 R Motorcycles 1:32 S10_2016 1996 Moto Guzzi 1100i Motorcycles 1:10 S24_2841 1900 Vintage Bi-Plane Planes 1:24 S24_4278 1900 Vintage Tri-Plane Planes 1:24 *Los datos provienen del ejemplo que proporcina BIRT, un reporteador de la fundacion Eclipse
¿Como se implementaria un RecordFilter para obtener los registros de un año en especial?
String filter = null;
public Filter(String filter){
this.filter = filter;
}
public boolean matches(byte [] record) {
ByteArrayInputStream bais = new ByteArrayInputStream(record);
DataInputStream dis = new DataInputStream(bais);
String id = dis.readUTF();
String year = dis.readUTF();
if (year.equals(filter)){
return true;
} else {
return false;
}
}
}
En el constructor se pondria un string con el año.
¿Como se implementaria un Comparator para ordenar los registros dependiendo del año?
public int compare(byte[] record1, byte[] record2){
String year1 = getYear(record1);
String year2 = getYear(record2);
if (year1.compareTo(year2) > 0)
return RecordComparator.FOLLOWS;
else if (year1.compareTo(year2) == 0)
return RecordComparator.EQUIVALENT;
else
return RecordComparator.PRECEDES;
}
private String getYear(byte[] record){
ByteArrayInputStream bais = new ByteArrayInputStream(record);
DataInputStream dis = new DataInputStream(bais);
dis.readUTF();
return dis.readUTF();
}
}
- beto.bateria's blog
- Inicie sesión o regístrese para enviar comentarios
Comentarios recientes
hace 3 días 1 hora
hace 3 días 1 hora
hace 2 días 11 horas
hace 45 semanas 1 día
hace 2 años 4 semanas
hace 2 años 8 semanas
hace 2 años 16 semanas
hace 2 años 24 semanas
hace 2 años 27 semanas
hace 2 años 28 semanas