style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

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 class Comparator implements RecordComparator{

    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:

RecordEnumeration enumeration = rs.enumerateRecords(filter, comparator, false);
filtrara y ordenara los registros.
RecordEnumeration enumeration = rs.enumerateRecords(null, comparator, false);
ordenara los registros.
RecordEnumeration enumeration = rs.enumerateRecords(filter, null, false);
filtrara los registros.
RecordEnumeration enumeration = rs.enumerateRecords(null, null, false);
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?

public class Filter implements RecordFilter {

    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 class Comparator implements RecordComparator{

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

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">