Descrição
RecordStore nada mais é que uma classe que armazena dados num arquivos RMS que é um formato criptografado do celular - como se fosse um "banco de dados". Nem pense em copiar o arquivo RMS para o PC para lê-lo em um programa desktop porque não é possível.
Este exemplo abaixo é um exemplo real que estava em funcionamento.
Bean Despesa.java
Será usado no exemplo
import java.util.*;
public class Despesa {
private int id;
private String valor;
private Date data;
private String descricao;
private int tipo;
private boolean cartao, pagar;
private int cheque;
public Despesa() {
this.id = 0;
this.valor = "0,00";
this.data = new Date();
this.descricao = "";
this.tipo = 0;
this.cartao = false;
this.pagar = false;
this.cheque = 0;
}
// --------- setter
public void setId(int aid) {
this.id = aid;
}
public void setValor(String avalor) {
this.valor = avalor;
}
public void setData(Date adata) {
this.data = adata;
}
public void setDescricao(String adescricao) {
this.descricao = adescricao;
}
public void setTipo(int atipo) {
this.tipo = atipo;
}
public void setCartao(boolean acartao) {
this.cartao = acartao;
}
public void setPagar(boolean apagar) {
this.pagar = apagar;
}
public void setCheque(int acheque) {
this.cheque = acheque;
}
// ----------- getter
public int getId() {
return this.id;
}
public String getValor() {
if (this.valor.equals(""))
this.valor = "0,00";
return this.valor;
}
public Date getData() {
return this.data;
}
public String getDescricao() {
return this.descricao;
}
public int getTipo() {
return this.tipo;
}
public boolean getCartao() {
return this.cartao;
}
public boolean getPagar() {
return this.pagar;
}
public int getCheque() {
return this.cheque;
}
public String toString() {
Calendar c = Calendar.getInstance();
c.setTime(getData());
String s = c.get(Calendar.DATE) + "/" + (c.get(Calendar.MONTH) + 1) + "/" + c.get(Calendar.YEAR);
return getValor() + "^" + s + "^" +
getDescricao() + "^" + Geral.CODIGOS[getTipo()] + "^" + (getCartao() ? "S" : "N") + "^" +
(getPagar() ? "S" : "N") + "^" + getCheque() + "\r\n";
}
}
OrdemDescricao.java
Objeto usado no método getDespesas() da persistência para trazer as despesas em ordem alfabética
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import javax.microedition.rms.RecordComparator;
public class OrdemDescricao implements RecordComparator {
public int compare(byte[] par1, byte[] par2) {
String str1 = new String();
String str2 = new String();
ByteArrayInputStream bFluxo;
DataInputStream dFluxo;
try {
bFluxo = new ByteArrayInputStream(par1);
dFluxo = new DataInputStream(bFluxo);
str1 = dFluxo.readUTF();
bFluxo = new ByteArrayInputStream(par2);
dFluxo = new DataInputStream(bFluxo);
str2 = dFluxo.readUTF();
} catch (Exception e) {
System.err.println("Erro: " + e.toString());
}
int result = str1.compareTo(str2);
if (result == 0)
return RecordComparator.EQUIVALENT;
else
if (result < 0)
return RecordComparator.PRECEDES;
else
return RecordComparator.FOLLOWS;
}
}
Persistencia.java
A persistência transforma objetos do tipo Despesa em registros de um RecordStore e vice versa
import java.util.*;
import java.io.*;
import javax.microedition.rms.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Persistencia {
private RecordStore rr;
private byte[] registro;
public Persistencia() {
// ja abre o RecordStore na criação
try {
rr = RecordStore.openRecordStore("honey", true);
} catch (Exception e) {
System.err.println(e.toString());
}
}
// adiciona uma despesa na base
public boolean add(Despesa despesa) {
try {
// cria o fluxo de saída
ByteArrayOutputStream bFluxo = new ByteArrayOutputStream();
DataOutputStream dFluxo = new DataOutputStream(bFluxo);
// grava os campos
dFluxo.writeUTF(despesa.getDescricao());
dFluxo.writeUTF(despesa.getValor());
dFluxo.writeInt(despesa.getTipo());
dFluxo.writeLong(despesa.getData().getTime());
dFluxo.writeBoolean(despesa.getCartao());
dFluxo.writeBoolean(despesa.getPagar());
dFluxo.writeInt(despesa.getCheque());
// grava
dFluxo.flush();
registro = bFluxo.toByteArray();
rr.addRecord(registro, 0, registro.length);
bFluxo.reset();
// fecha
bFluxo.close();
dFluxo.close();
return true;
} catch (Exception e) {
System.err.println(e.toString());
return false;
}
}
// carrega uma despesa pelo Id
public Despesa get(int id) {
try {
int recordSize = rr.getRecordSize(id);
byte[] reg = new byte[recordSize];
ByteArrayInputStream bFluxo = new ByteArrayInputStream(reg);
DataInputStream dFluxo = new DataInputStream(bFluxo);
rr.getRecord(id, reg, 0);
Despesa desp = new Despesa();
desp.setId(id);
desp.setDescricao(dFluxo.readUTF());
desp.setValor(dFluxo.readUTF());
desp.setTipo(dFluxo.readInt());
Date d = new Date();
d.setTime(dFluxo.readLong());
desp.setData(d);
desp.setCartao(dFluxo.readBoolean());
desp.setPagar(dFluxo.readBoolean());
desp.setCheque(dFluxo.readInt());
// grava
bFluxo.reset();
// fecha
bFluxo.close();
dFluxo.close();
return desp;
} catch (Exception e) {
System.err.println(e.toString());
return new Despesa();
}
}
// atualiza os dados da despesa
public boolean update(Despesa despesa) {
try {
// fluxos
ByteArrayOutputStream bFluxo = new ByteArrayOutputStream();
DataOutputStream dFluxo = new DataOutputStream(bFluxo);
// grava os campos
dFluxo.writeUTF(despesa.getDescricao());
dFluxo.writeUTF(despesa.getValor());
dFluxo.writeInt(despesa.getTipo());
dFluxo.writeLong(despesa.getData().getTime());
dFluxo.writeBoolean(despesa.getCartao());
dFluxo.writeBoolean(despesa.getPagar());
dFluxo.writeInt(despesa.getCheque());
// grava
dFluxo.flush();
registro = bFluxo.toByteArray();
rr.setRecord(despesa.getId(), registro, 0, registro.length);
bFluxo.reset();
// fecha
bFluxo.close();
dFluxo.close();
return true;
} catch (RecordStoreNotOpenException e) {
System.err.println(e.toString());
return false;
} catch (RecordStoreException e) {
System.err.println(e.toString());
return false;
} catch (IOException e) {
System.err.println(e.toString());
return false;
}
}
// obtem uma matriz das despesas cadastradas
public Despesa[] getDespesas() {
Despesa[] despesas = null;
try {
despesas = new Despesa[rr.getNumRecords()];
OrdemDescricao ordem = new OrdemDescricao();
RecordEnumeration re = rr.enumerateRecords(null, ordem, false);
int i = 0;
// enquanto tem elementos...
while (re.hasNextElement()) {
despesas[i] = get(re.nextRecordId());
i++;
}
} catch (RecordStoreNotOpenException e) {
e.printStackTrace();
} catch (InvalidRecordIDException e) {
System.err.println(e.toString());
}
return despesas;
}
// exclui uma despesa
public void delete(Despesa despesa) {
try {
rr.deleteRecord(despesa.getId());
} catch (RecordStoreNotOpenException ex) {
ex.printStackTrace();
} catch (InvalidRecordIDException ex) {
ex.printStackTrace();
} catch (RecordStoreException ex) {
ex.printStackTrace();
}
}
// zerar a base
public void deleteAll() {
try {
rr.closeRecordStore();
rr.deleteRecordStore("honey");
rr = RecordStore.openRecordStore("honey", true);
} catch (Exception e) {
System.err.println(e.toString());
}
}
// fechar o recordstore
public void fechar() {
try {
rr.closeRecordStore();
} catch (Exception e) {
System.err.println(e.toString());
}
}
}
Como usar
// quando inicializar o programa
public Persistencia persistencia = new Persistencia();
// consultar despesas
private Despesa[] despesas;
despesas = persistencia.getDespesas();
// percorre os itens que vieram da persistencia
for (int i = 0; i < despesas.length; i++)
despesas[i].getValor() ... despesas[i].getDescricao() ... etc
// apagar uma desesa:
persistencia.delete(despesa); // o que importa é o ID
// apagar todas as despesas
persistencia.deleteAll();
// inserir ou editar uma despesa
// se o id é zero é inclusão
if (despesa.getId() == 0)
Honey.persistencia.add(despesa);
else
Honey.persistencia.update(despesa);
// quando finalizar o programa...
persistencia.fechar();
Veja também
Serializando J2ME:
http://www.devmedia.com.br/articles/viewcomp.asp?comp=83
J2ME e a API Record Management System (RMS):
http://www.javafree.org/javabb/viewtopic.jbb?t=5853
Persistência com MIDP:
http://www.guj.com.br/posts/list/2788.java