Persistência com MIDP
em 07/05/2003
, por Márcio Guedes
Minimo de 512 k para executar a VM;
256 k para alocacao de memória;
CLDC
Minimo de 128 k para executar a VM;
32 k para alocacao de memória;
Interface mais restrita;
Mesmo com a divisão do J2ME entre as configurações, a variedade entre dispositivos ainda é muito grande. Para resolver isso a Sun criou extensões das configurações chamadas Profiles. Um Profile define as características da linguagem para um tipo particular de dispositivo.
Este tutorial irá demonstrar como utilizar um recurso poderoso do profile MIDP para realizar persistencia de dados chamado RMS (Record Management System). Você pode utilizar qualquer editor de sua preferência. Faça o download do J2ME Wireless Toolkit no site da Sun. Para saber mais detalhes sobre isso, veja o primeiro tutorial de MIDP na seção de tutoriais do GUJ.
O primeiro parâmetro do método openRecordStore é o nome da coleção de registros (record store). O segundo parâmetro indica que, se o record store nao existir, ele será criado. O nome do record store não pode ter mais de 32 caracteres. A classe de exceção RecordStoreNotFoundException extende RecordStoreException que é a classe base para todas as exceções RMS. A exceção RecordStoreException é levantada se o record store não puder ser criado por falta de espaço ou algum erro interno. Para fechar um record store execute o método closeRecordStore, veja o código a seguir:
O valor retornado pelo método addRecord é um identificador único para o registro adicionado. Os identificadores de registros começam em 1 e são incrementados a cada registro adicionado. Para obter o número identificador do próximo registro a ser adicionado utilize o método getNextRecordID, veja o código a seguir:
O primeiro parâmetro é o identificador do registro, o segundo parâmetro é o array de bytes onde o conteúdo do registro será copiado e o terceiro parâmetro é o offset de onde será iniciada a cópia. Assume-se que o array informado para o segundo parâmetro será grande o suficiente para armazenar o tamanho do registro. Utilize o método getRecordSize para obter o tamanho do registro e redimensionar o array de bytes antes de chamar o método getRecord.
Perceba que não é possível alterar apenas parte dos dados de um registro. O registro é substituido pelo novo registro.
Para uma navegação simples um loop funciona perfeitamente. No entanto, se você deseja ordenar e/ou localizar os registros, a classe RecordEnumeration possui recursos poderosos para executar a navegação. O que torna a classe RecordEnumerator tão especial é o fato que ela pode navegar nos registros utilizando um RecordFilter (para localizar) ou um RecordComparator (para ordenar). Por exemplo, utilizando a interface RecordFilter, é possível filtrar os registros que começam com alguma substring ou, utilizando a interface RecordComparator, é possível ordenar os registros na ordem alfabética. A classe RecordEnumerator não possui um construtor. Para obter uma instância, execute o método enumerateRecords da classe RecordStore. Os parâmetros desse método são, respectivamente, um RecordFilter, um RecordComparator e um booleano que indica se os registros alterados por outros MIDlets serão visualizados no enumerator.
Utilize agora a classe criada para ordenar os registros. Veja o código a seguir:
Esta classe irá filtrar todos os registros que possuem o nome igual ao nome passado no parâmetro do construtor. Utilize agora a classe criada para filtrar os registros. Veja o código a seguir:
O método execute da nossa classe criada irá fazer chamada de todos os nossos métodos que encapsulam a framework do RMS. Veja a seguir a saída do método execute:
É isso aí. Você pode baixar aqui no GUJ os código utilizados nesse tutorial.
Introdução
Para suportar a grande variedade de produtos referentes a J2ME, a Sun criou o conceito de Configurações (Configurations). Uma configuração define uma plataforma para uma variedade de dispositivos de pequeno porte. A idéia de uma configuração é muito ligada a uma VM. De fato, uma configuração define as caracteristicas da linguagem e as bibliotecas disponíveis.
Basicamente existem dois tipos de configurações: CDC (Connected Device Configuration) e CLDC (Connected Limited Device Configuration). Veja a seguir as caracteristicas de cada uma:
CDC
Entendendo RMS
MIDP possui um conjunto de classes para realizar a persistência de dados chamado RMS (Record Management System). O mecanismo de armazenamento do RMS é implementado como uma coleção de registros onde cada registro é organizado como um array de bytes. O tamanho do array de bytes pode variar para cada registro e não existem limitações para o seu conteúdo.
Um record store é representado pela classe javax.microedition.rms.RecordStore. Através do método openRecordStore é possível uma instância, veja o código a seguir:
O primeiro parâmetro do método openRecordStore é o nome da coleção de registros (record store). O segundo parâmetro indica que, se o record store nao existir, ele será criado. O nome do record store não pode ter mais de 32 caracteres. A classe de exceção RecordStoreNotFoundException extende RecordStoreException que é a classe base para todas as exceções RMS. A exceção RecordStoreException é levantada se o record store não puder ser criado por falta de espaço ou algum erro interno. Para fechar um record store execute o método closeRecordStore, veja o código a seguir:
Adicionando Registros com RMS
É possível adicionar registros ao record store aberto utilizando o método addRecord, veja o código a seguir:
O valor retornado pelo método addRecord é um identificador único para o registro adicionado. Os identificadores de registros começam em 1 e são incrementados a cada registro adicionado. Para obter o número identificador do próximo registro a ser adicionado utilize o método getNextRecordID, veja o código a seguir:
Excluindo Registros com RMS
Para excluir um registro do record store execute o método deleteRecord, é necessário informa o id do registro a ser excluído como parâmetro para o método deleteRecord. Veja o código a seguir:
Recuperando Registros com RMS
Para recuperar um registro utilize o método getRecord. Veja o código a seguir:
O primeiro parâmetro é o identificador do registro, o segundo parâmetro é o array de bytes onde o conteúdo do registro será copiado e o terceiro parâmetro é o offset de onde será iniciada a cópia. Assume-se que o array informado para o segundo parâmetro será grande o suficiente para armazenar o tamanho do registro. Utilize o método getRecordSize para obter o tamanho do registro e redimensionar o array de bytes antes de chamar o método getRecord.
Alterando Registros com RMS
Para alterar os dados de um registro utilize o método setRecord. Veja o código a seguir:
Perceba que não é possível alterar apenas parte dos dados de um registro. O registro é substituido pelo novo registro.
Navegando nos Registros com RMS
Existem duas formas de navegar nos registros de um record store. Pode-se navegar utilizando um loop simples entre os registros ou utilizar a classe RecordEnumeration do RMS. Veja o código a seguir:
Para uma navegação simples um loop funciona perfeitamente. No entanto, se você deseja ordenar e/ou localizar os registros, a classe RecordEnumeration possui recursos poderosos para executar a navegação. O que torna a classe RecordEnumerator tão especial é o fato que ela pode navegar nos registros utilizando um RecordFilter (para localizar) ou um RecordComparator (para ordenar). Por exemplo, utilizando a interface RecordFilter, é possível filtrar os registros que começam com alguma substring ou, utilizando a interface RecordComparator, é possível ordenar os registros na ordem alfabética. A classe RecordEnumerator não possui um construtor. Para obter uma instância, execute o método enumerateRecords da classe RecordStore. Os parâmetros desse método são, respectivamente, um RecordFilter, um RecordComparator e um booleano que indica se os registros alterados por outros MIDlets serão visualizados no enumerator.
Ordenando Registros com RMS
A interface RecordComparator possui um único método que compara dois arrays de bytes. Crie uma classe que implementa essa interface, implemente o método compare e passe uma instância da sua classe para o RecordEnumerator. Veja o código a seguir:
Utilize agora a classe criada para ordenar os registros. Veja o código a seguir:
Filtrando Registros com RMS
A interface RecordFilter possui um único método que recebe um array de bytes como parâmetro. Crie uma classe que implementa essa interface, implemente o método matches e passe uma instância da sua classe para o RecordEnumerator. Veja o código a seguir:
Esta classe irá filtrar todos os registros que possuem o nome igual ao nome passado no parâmetro do construtor. Utilize agora a classe criada para filtrar os registros. Veja o código a seguir:
Classe gerada
Veja a seguir o código execute da classe gerada.
O método execute da nossa classe criada irá fazer chamada de todos os nossos métodos que encapsulam a framework do RMS. Veja a seguir a saída do método execute:
É isso aí. Você pode baixar aqui no GUJ os código utilizados nesse tutorial.