Almacenamiento Persistente Juan Manuel Fernández Luna Departamento de Ciencias de la Computación e Inteligencia Artificial...
Introducción MIDP ofrece un mecanismo para que los MIDlets almacenen datos de manera persistente y los recuperen posterior...
Almacén de registros Un almacén de registros (record store) consiste en una colección de registros que persistirán a lo la...
Almacén de registros Sólo se permite la manipulación de los almacenes de registros a las suites de MIDlets que los poseen....
Almacén de registros Los nombres de los almacenes de registros es sensible a las mayúsculas y puede consistir en cualquier...
Almacén de registros El almacén guarda el día y hora de última modificación. Mantiene una versión (cada vez que hay un cam...
Registros Registros: vectores de bytes. Se puede usar: DataInputStream y DataOutputStream, así como ByteArrayInputStream y...
Registros Los registros de identifican unívocamente dentro del registro al que pertenecen por medio de su recordId, que es...
Almacén de registros 1            Primary key           Almacén de registros 2              Record ID             Data    ...
Clases para la persistencia Paquete:    javax.microedition.rms Clases:    RecordStore, RecordEnumeration Interfaces:    Re...
Gestión del almacén openRecordStore() closeRecordStore() listRecordStore() deleteRecordStore() getVersion() getLastModifie...
Gestión del almacénApertura de un almacén:static RecordStore openRecordStore       (recordStoreName, createIfNecessary)  A...
Gestión del almacénCierre de un almacén:void closeRecordStore()  Excepciones:     RecordStoreException,     RecordStoreNot...
Gestión del almacénUn almacén de registros debería cerrarse tanpronto como se acabe de usar, ya queconsume recursos.El mét...
Gestión del almacénBorrado de un almacén:static void deleteRecordStore (recordStoreName)   Excepciones:      RecordStoreEx...
Manipulación de registros Manipulación básica:   addRecord(), deleteRecord(), and getRecord(),   setRecord() Información s...
Manipulación de registros Añadir un registro: int addRecord(byte[] data, int offset, int numBytes)    Añade un nuevo regis...
Manipulación de registros:  Obtener un registro:  int getRecord(int recordId, byte[] buffer, int offset)       Devuelve el...
Manipulación de registros:   Asignar valor a un registro:void setRecord(int recordId, byte[] newData, int offset,   I     ...
Monitorización de cambios RecordListener   recordAdded(recordStore, recordID)   recordChanged(recordStore, recordID)   rec...
Información de tamañoNúmero de registros:int getNumRecords()     Devuelve el número de registros en el     almacén.Tamaño ...
Información de tamaño.getSizeint getSize()  Devuelve la cantidad de espacio, en bytes,  que ocupa el registro.getSizeAvail...
Enumeración getNextRecordID int getNextRecordID()     Devuelve el recordId del siguiente registro     que será añadido al ...
EmumeraciónInterfaz que mantiene una secuencia delos recordids de los registrosalmacenados.Métodos:  hasNextElement(), has...
Emumeracióntry {RecordEnumeration re =   rs.enumerateRecords(null,null,false) ;System.out.println("Hay " + re.numRecords()...
Filtrado de registros RecordFilter es un interfaz que se utiliza para seleccionar registros (para actualizarlos o eliminar...
Comparación de registrosInterfaz que define un comparador de dosregistros para determinar un orden relativoentre registros...
Comparación de registrosRecordComparator c = new AddressRecordComparator();      // clase que implementa RecordComparatori...
Fuentes http://developers.sun.com/techtopics /mobility/articles/databaserms
Upcoming SlideShare
Loading in …5
×

Persistencia

638 views

Published on

rff

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
638
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
10
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Persistencia

  1. 1. Almacenamiento Persistente Juan Manuel Fernández Luna Departamento de Ciencias de la Computación e Inteligencia Artificial Programación de Dispositivos Móviles con J2ME Septiembre/Octubre de 2006
  2. 2. Introducción MIDP ofrece un mecanismo para que los MIDlets almacenen datos de manera persistente y los recuperen posteriormente. Este mecanismo de almacenamiento persistente, llamado Record Management System (RMS), se modela mediante una “base de datos” simple basada en registros. Persistencia en MIDP 2
  3. 3. Almacén de registros Un almacén de registros (record store) consiste en una colección de registros que persistirán a lo largo de múltiples invocaciones de un MIDlet. Los almacenes de registros se crean en zonas dependientes de la plataforma, que no están expuestos directamente a los MIDlets. El espacio de nombres del almacén de registro se controla en el ámbito del MIDlet Suite. Los MIDlets dentro de una MIDlet suite tienen permitido crear múltiples almacenes y acceder a ellos. El resto no. Persistencia en MIDP 3
  4. 4. Almacén de registros Sólo se permite la manipulación de los almacenes de registros a las suites de MIDlets que los poseen. No se ofrece ningún mecanismo para compartir registros entre MIDlets que pertenezcan a suites diferentes. Persistencia en MIDP 4
  5. 5. Almacén de registros Los nombres de los almacenes de registros es sensible a las mayúsculas y puede consistir en cualquier combinación de hasta 32 caracteres Unicode. No se suministran operaciones de bloqueo. La implementación de los almacenes de registros asegura que todas las operaciones sobre los mismos son atómicas, síncronas y serializadas, por lo que no puede llegar a ocurrir que se corrompan con accesos múltiples. Persistencia en MIDP 5
  6. 6. Almacén de registros El almacén guarda el día y hora de última modificación. Mantiene una versión (cada vez que hay un cambio se incrementa ésta). Esto es útil para sincronización de aplicaciones. Cuando una aplicación se elimina del dispositivo también se elimina los almacenes que tuviera. Persistencia en MIDP 6
  7. 7. Registros Registros: vectores de bytes. Se puede usar: DataInputStream y DataOutputStream, así como ByteArrayInputStream y ByteArrayOutputStream para empaquetar y desmpaquetar diferentes tipos de datos en y desde un vector de bytes. Persistencia en MIDP 7
  8. 8. Registros Los registros de identifican unívocamente dentro del registro al que pertenecen por medio de su recordId, que es un valor entero. RecordId se usa como clave primaria del registro. El primer registro que se crea en un almacén tendrán un recordId igual a 1, y cada nuevo registro se incrementará en una unidad. Los MIDlets pueden crear sus índices utilizando la clase RecordEnumeration. Persistencia en MIDP 8
  9. 9. Almacén de registros 1 Primary key Almacén de registros 2 Record ID Data (int) Primary key (byte[])Registro AlmacénID registros 3 Record de DataRegistro (int)Primary key (byte[]) Registro Record ID Data Registro (int) (byte[]) Registro 1 Registro 2
  10. 10. Clases para la persistencia Paquete: javax.microedition.rms Clases: RecordStore, RecordEnumeration Interfaces: RecordComparator, RecordFilter, RecordListener Excepciones: RecordStoreException, RecordStoreFullException, RecordStoreNotFoundException, InvalidRecordException, RecordStoreNotOpenException Persistencia en MIDP 10
  11. 11. Gestión del almacén openRecordStore() closeRecordStore() listRecordStore() deleteRecordStore() getVersion() getLastModified() Persistencia en MIDP 11
  12. 12. Gestión del almacénApertura de un almacén:static RecordStore openRecordStore (recordStoreName, createIfNecessary) Abre (y en su caso crea) un almacén de registros asociado con la correspondiente suite MIDlet. Excepciones: RecordStoreException, RecordStoreFullException, RecordStoreNotFoundException Persistencia en MIDP 12
  13. 13. Gestión del almacénCierre de un almacén:void closeRecordStore() Excepciones: RecordStoreException, RecordStoreNotOpenExceptionListado de almacenes:static String[] listRecordStores() Devuelve un vector de nombres de almacenes de registros poseídos por el MIDlet suite. Persistencia en MIDP 13
  14. 14. Gestión del almacénUn almacén de registros debería cerrarse tanpronto como se acabe de usar, ya queconsume recursos.El método closeRecordStore() realmente nocierra el almacén, sino que informa que elproceso o hilo ha dejado de usarlo.El almacén se cierra sólo cuando todos losprocesos / hilos que lo utilizaban hanllamado al método de cierre.
  15. 15. Gestión del almacénBorrado de un almacén:static void deleteRecordStore (recordStoreName) Excepciones: RecordStoreException, RecordStoreNotFoundExceptionVersión (se incrementa en uno en cada modificación del almacén)int getVersion()Fecha de última modificación:long getLastModified() Persistencia en MIDP 15
  16. 16. Manipulación de registros Manipulación básica: addRecord(), deleteRecord(), and getRecord(), setRecord() Información sobre un almacén: getNumRecords() , getRecordSize() Información sobre un registro: getSize(), getSizeAvailable() Enumeración: getNextRecordID() Persistencia en MIDP 16
  17. 17. Manipulación de registros Añadir un registro: int addRecord(byte[] data, int offset, int numBytes) Añade un nuevo registro al almacén. Se devuelve el recorId del nuevo registro. Borrar un registro: void deleteRecord(int recordId) Se borra el registro indicado. No se libera espacio, sino que se añade a la lista de registros libres para su posterior uso. No se utilizan los antiguos recordIds. Persistencia en MIDP 17
  18. 18. Manipulación de registros: Obtener un registro: int getRecord(int recordId, byte[] buffer, int offset) Devuelve el dato almacenado en el registro dado. Devuelve el número de bytes copiados en el buffer. byte[] getRecord(int recordId) Persistencia en MIDP 18
  19. 19. Manipulación de registros: Asignar valor a un registro:void setRecord(int recordId, byte[] newData, int offset, I int nBytes) Asigna nuevos datos al registro ya existente. Persistencia en MIDP 19
  20. 20. Monitorización de cambios RecordListener recordAdded(recordStore, recordID) recordChanged(recordStore, recordID) recordDeleted(recordStore, recordID) RecordStore addRecordListener(listener) removeRecordListener(listener) Persistencia en MIDP 20
  21. 21. Información de tamañoNúmero de registros:int getNumRecords() Devuelve el número de registros en el almacén.Tamaño del registro:int getRecordSize(int recordId) Devuelve el tamaño (en bytes) de los datos del MIDlet disponible en el registro. Persistencia en MIDP 21
  22. 22. Información de tamaño.getSizeint getSize() Devuelve la cantidad de espacio, en bytes, que ocupa el registro.getSizeAvailable getSizeAvailable()int getSizeAvailable Devuelve la cantidad de espacio adicional (en bytes) disponible para que el almacén crezca. Persistencia en MIDP 22
  23. 23. Enumeración getNextRecordID int getNextRecordID() Devuelve el recordId del siguiente registro que será añadido al almacén. Persistencia en MIDP 23
  24. 24. EmumeraciónInterfaz que mantiene una secuencia delos recordids de los registrosalmacenados.Métodos: hasNextElement(), hasPreviousElement() nextRecord(), nextRecordId() previousRecord(), previousRecordId() numRecords() … Persistencia en MIDP 24
  25. 25. Emumeracióntry {RecordEnumeration re = rs.enumerateRecords(null,null,false) ;System.out.println("Hay " + re.numRecords() + " en RecordStore") ;while(re.hasNextElement()) { byte tmp[] = re.nextRecord() ; System.out.println(tmp[0] + " " + tmp[1]) ; }} catch (Exception e) { …} Persistencia en MIDP 25
  26. 26. Filtrado de registros RecordFilter es un interfaz que se utiliza para seleccionar registros (para actualizarlos o eliminarlos), mediante algún criterio. Se debe implementar el siguiente método: boolean matches(byte[] candidate) Devuelve verdadero si el candidato se corresponde con el criterio.
  27. 27. Comparación de registrosInterfaz que define un comparador de dosregistros para determinar un orden relativoentre registros.Define un método para comparar. int compare(byte[] rec1, byte[] rec2)Devuelve: PROCEEDS, FOLLOWS, EQUIVALENT Persistencia en MIDP 27
  28. 28. Comparación de registrosRecordComparator c = new AddressRecordComparator(); // clase que implementa RecordComparatorif (c.compare(recordStore.getRecord(rec1), recordStore.getRecord(rec2)) == RecordComparator.PRECEDES)return rec1; Persistencia en MIDP 28
  29. 29. Fuentes http://developers.sun.com/techtopics /mobility/articles/databaserms

×