250 likes | 433 Views
DESARROLLO DE SOLUCIONES EMPRESARIALES MOVILES USANDO TECNOLOGIA SUN. APLICACIONES MOVILES CON J2ME RMS. Ing. Ronald Criollo. Introducción RecordStore Record. AGENDA.
E N D
DESARROLLO DE SOLUCIONES EMPRESARIALES MOVILES USANDO TECNOLOGIA SUN APLICACIONES MOVILES CON J2ME RMS Ing. Ronald Criollo
Introducción • RecordStore • Record AGENDA
La información hasta ahora manejada ha sido de tipo no persistente, de tal forma que al terminar la aplicación y volverla a ejecutar, no se pueden recuperar los datos. • Para lograr persistencia se requiere de la manipulación de archivos, elemento que no está presente en la mayoría de los dispositivos móviles con CLDC/MIDP. INTRODUCCIÓN
Para lograr la persistencia se requiere de un motor de persistencia conocida como RMS (Record Management System) que no es otra cosa que una pequeña base de datos empotrada en el dispositivo. • La unidad básica de almacenamiento de la información es el registro (record), ubicado en un almacén de registros (record store). INTRODUCCIÓN
Sencillo sistema de almacenamiento. • Almacenamiento permanente. • Compuesto por Record Stores. • Registro accesible desde cualquier MIDlet. RMS
Antes de operar un registro se debe abrir o crear. Las operaciones pueden ser de lectura y escritura. • Se utiliza el paquete javax.microedition.rms.* RMS
Colección de registros • La plataforma mantiene su integridad • Borrar MIDlet borra RecordStore • Manipulación de RecordStore: • openRecordStore: abre/crea un RecordStore • closeRecordStore: cierra un RecordStore • deleteRecordStore: borra un RecordStore RecordStore
Identificados por recordID:int • 1er registros recordID =1 • Manipulación de registros: • addRecord: añade un registro • deleteRecord: borra un registro • getRecord: obtiene los datos de un registro • setRecord: establece los datos de un registro Records
Se cuentan con las interfaces de: • RecordEnumeration • RecordComparator • RecordFilters • RecordListener • Los datos a agregar deben estar en formato de un arreglo de bytes • rs.addRecord(bytes, 0, bytes.length) RMS
La interface RecordListener permite monitorizar los cambios en un RecordStore. • Cuando se modifica un RecordStore se lanza un evento al RecordListener asociado. • Hay 3 tipos de eventos: • recordAdded(RecordStore rs,int recordId) • recordChanged(RecordStore rs,int recordId) • recordDeleted(RecordStore rs,int recordId) RMS
La clase RecordStore no dispone de ningún constructor, pero posee el método estático: • static RecordStore openRecordStore(String name, boolean createIfNeccesary) Este método nos abre el Record Store con el nombre pasado como parámetro o nos crea uno si no existe cuando el parámetro createIfNeccesary es true. Además, existen otras dos versiones alternativas de este método: • static RecordStore openRecordStore(String name, boolean createIfNeccesary, int autorización, boolean writable) • static RecordStore openRecordStore(String name, String vendorName, String suiteName) CREACION DE UN RECORD STORE
El primero de ellos usa los siguientes parámetros: Autorización: • AUTHMODE_PRIVATE: Sólo permite el acceso al Record Store a la MIDlet suite que lo creó. • AUTHMODE_ANY: Permite el acceso a cualquier MIDlet del dispositivo. Este modo hay que usarlo con mucho cuidado ya que podría provocar problemas de privacidad y seguridad. writable: Indicamos si el Record Store puede ser modificado por cualquier MIDlet que pueda acceder a él. El segundo método lo usaremos para abrir un Record Store que está asociado a alguna MIDlet suite especificada por los parámetros vendorName y suiteName. El acceso vendrá limitado por el tipo de autorización del Record Store cuando fue creado CREACION DE UN RECORD STORE
Cuándo terminemos de usar el Record Store, hay que cerrar la comunicación con él. Esto lo haremos mediante el método: • public void closeRecordStore() throws RecordStoreNotFoundException, RecordStoreException Para cerrar correctamente la comunicación con un Record Store, es necesario invocar este método tantas veces como llamadas se haya realizado al método openRecordStore(). CIERRE DE UN RECORD STORE
for (int i=1;i<=rs.getNumRecords();i++){ longitud = rs.getRecordSize(i); registro = rs.getRecord(i); System.out.println(“Registro “+i+”: “+ new String(registro,0,longitud)); } Interfaz RecordEnumeration RECORRIENDO UN RECORD STORE
RecordEnumeration re = rs.enumerateRecords(null,null,false); while (re.hasNextElement()){ registro = re.nextRecord(); //Realizo las operaciones que quiera ... } RECORRIENDO UN RECORD STORE
Para realizar una búsqueda eficiente de registros en un Record Store vamos a utilizar la interfaz RecordFilter. Esta interfaz se encarga de devolver al RecordEnumeration únicamente los registros que coincidan con un determinado patrón de búsqueda. Para usar esta interfaz hemos de implementar necesariamente el método: public boolean matches(byte [] candidato) que se encarga de comparar el registro candidato pasado como parámetro con el valor que queremos buscar y devolvemos true en caso de que coincidan. En el siguiente ejemplo vamos a crear un RecordFilter y así podremos ver su funcionamiento BUSQUEDA EN UN RECORD STORE
public class Filtro implements RecordFilter{ private String cadenaabuscar = null; public Filtro(String cadena){ this.cadenaabuscar = cadena.toLowerCase(); } public boolean matches(byte[] candidato){ boolean resultado = false; String cadenacandidata; ByteArrayInputStream bais; DataInputStream dis; try{ bais = new ByteArrayInputStream(candidato); dis = new DataInputStream(bais); cadenacandidata = dis.readUTF().toLowerCase(); } catch (Exception e){ return false; } if ((cadenacandidata != null) && (cadenacandidata.indexOf(cadenaabuscar) != -1)) return true; else return false; } } BUSQUEDA EN UN RECORD STORE
Si usamos este RecordFilter a la hora de invocar a enumerateRecords(): //Creo un objeto de tipo RecordFilter Filtro buscar = new Filtro(“Antonio”); //Obtengo el RecordEnumeration usando el filtro anterior RecordEnumeration re = rs.enumerateRecords(buscar,null,false); //Si encuentro algún registro dado el patrón de búsqueda if (re.numRecords() > 0) System.out.println(“Patron ‘Antonio’ encontrado”); el resultado será que el RecordEnumeration devuelto sólo contendrá los registros en los que se haya encontrado el patrón de búsqueda. BUSQUEDA EN UN RECORD STORE
La ordenación de registros se realiza a través del interfaz RecordComparator. Esta interfaz funciona básicamente igual que el RecordFilter. Existe un método public int compare(byte[] reg1, byte[] reg2) que ha de ser implementado obligatoriamente. Este método es el encargado de realizar la comparación entre los campos que deseemos de los registros y el entero que nos devuelve nos indica si reg1 va antes o después que reg2. El valor devuelto por este método puede ser: EQUIVALENT: Los registros pasados al método compare son equivalentes. FOLLOWS: El primer registro sigue al segundo. PRECEDES: El primer registro precede al segundo. ORDENACION DE UN RECORD STORE
La ordenación de registros se realiza a través del interfaz RecordComparator. Esta interfaz funciona básicamente igual que el RecordFilter. Existe un método public int compare(byte[] reg1, byte[] reg2) que ha de ser implementado obligatoriamente. Este método es el encargado de realizar la comparación entre los campos que deseemos de los registros y el entero que nos devuelve nos indica si reg1 va antes o después que reg2. El valor devuelto por este método puede ser: EQUIVALENT: Los registros pasados al método compare son equivalentes. FOLLOWS: El primer registro sigue al segundo. PRECEDES: El primer registro precede al segundo. ORDENACION DE UN RECORD STORE
public class Compara implements RecordComparator{ public boolean compare(byte[] reg1, byte[] reg2){ ByteArrayInputStream bais; DataInputStream dis; String cad1, cad2; try{ bais = new ByteArrayInputStream(reg1); dis = new DataInputStream(bais); cad1 = dis.readUTF(); bais = new ByteArrayInputStream(reg2); dis = new DataInputStream(bais); cad2 = dis.readUTF(); int resultado = cad1.compareTo(cad2); if (resultado == 0) return RecordComparator.EQUIVALENT; else if (result < 0) return RecordComparator.PRECEDES; else return RecordComparator.FOLLOWS; } catch (Exception e){ return RecordComparator.EQUIVALENT; } } } ORDENACION DE UN RECORD STORE
Esta clase puede usarse a la hora de crear el RecordEnumeration para recorrer los elementos de manera ordenada: //Creo un objeto de tipo RecordComparator Compara comp = new Compara(); //Obtengo el RecordEnumeration usando el objeto anterior, y // con los registros ordenados RecordEnumeration re = rs.enumerateRecords(null,comp,false); ORDENACION DE UN RECORD STORE