J2ME: Agenda usando Floggy

05 junho 2009
Vamos aplicar o Floggy em uma agenda, a mesma que já vimos sem armazenamento persistente (Agenda sem banco) e com armazenamento usando RMS apenas (Agenda usando RMS).

Para quem não acompanhou ou não quer ver como foi feito o código da agenda não se preocupe! No final do post estaremos disponibilizando todo o código fonte para dowload.

Para utilizar o Floggy precisamos adicionar em Bibliotecas & Recursos um .jar do framework Floggy e editar o build.xml do projeto. Para aprender passo a passo como fazer estes passos veja o post Configurando o Netbeans para usar Floggy.

Agora vamos ao que interessa, o Floggy!

Precisamos guardar um nome e um telefone em cada registro do Record Store, para isso vamos criar uma classe agenda que contem os atributos nome e telefone e esta classe irá implementar Persistable, assim cada objeto desta classe será armazenado em um registro no Record Store. A classe então fica a seguinte:



package hello;

import net.sourceforge.floggy.persistence.FloggyException;
import net.sourceforge.floggy.persistence.Persistable;
import net.sourceforge.floggy.persistence.PersistableManager;

public class Agenda implements Persistable {
private String nome;
private String telefone;


public Agenda(){
nome = null;
telefone = null;
}

public void setNome(String nome) {
this.nome = nome;
}

public String getNome() {
return nome;
}

public String getTelefone() {
return telefone;
}

public void setTelefone(String telefone) {
this.telefone = telefone;
}

public void save(){
try{
PersistableManager.getInstance().save(this);
} catch (FloggyException ex) {
ex.printStackTrace();
}
}

}


O método save() será explicado logo adiante. Os demais são apenas getters e setters para pegar ou setar valores dos atributos nome e telefone.

Agora no código referente ao comando Inserir vamos fazer o seguinte:


if (command == cmdInserir) {
if(getTextFieldNome().getString().equals("")||getTextFieldTel().getString().equals("")){
getAlert().setString("Algum campo esta vazio! Preencha corretamente");
}else{
adicionarDadosAgenda();
getAlert().setString("Os dados foram inseridos com sucesso!");
getTextFieldNome().setString("");
getTextFieldTel().setString("");
}
switchDisplayable(getAlert(), getFormPrincipal());
}


Verificamos se os campos estão preenchidos corretamente e se eles estiverem chamamos o método adicionarDadosAgenda().

public void adicionarDadosAgenda(){
Agenda objetoAgenda = new Agenda();
objetoAgenda.setNome(textFieldNome.getString());
objetoAgenda.setTelefone(textFieldTel.getString());
objetoAgenda.save();
}


Cada vez que entrarmos neste método declaramos um objeto do tipo agenda. Isto é necessário, pois cada novo objeto é um registro do banco. Se instanciarmos apenas uma vez e usarmos o mesmo objeto, os dados serão sobrescritos.

Depois setamos os valores de nome e telefone com o setNome e setTelefone, em seguida apenas chamamos o método save() da classe Agenda. O código da classe Agenda esta listado acima e dentro do método save() apenas chamamos uma operação do Floggy, a save(objeto).
Esta operação salva um objeto no banco, o objeto que esta sendo passado como parâmetro é o objeto corrente da própria classe Agenda, por isso passamos o parâmetro this.

public void save(){
try{
PersistableManager.getInstance().save(this);
} catch (FloggyException ex) {
ex.printStackTrace();
}
}


Para exibir estes dados utilizamos o método listarDados():


private void listarDados() {

// O ObjectSet é uma interface que serve como um cursor para fazer iterações em um
//conjunto de objetos recuperados de uma consulta
ObjectSet os = null;

try {
//os recebe as instâncias de todos os objetos encontrados no banco, já que
//não possui nenhum filtro ou comparador para limitar os registros recuperados
os = PersistableManager.getInstance().find(Agenda.class, null, null);

//os.size() retorna o número de registros que tem no banco

for(int i=0;i < os.size();i++){
//cada objeto agenda recebe uma instância da classe Agenda que esta
//guardada nos registros do banco
Agenda objetoAgenda = (Agenda) os.get(i);

//Escreve no list o nome e telefone recuperado de cada registro do Record
//Store
getList().append(objetoAgenda.getNome() + " - " + objetoAgenda.getTelefone(), null);
}
}catch (FloggyException ex){
getList().append("Erro list record", null);
}
}


Pronto! Esta pronto nossa agenda com Floggy!
Para quem acompanhou o post J2ME: Agenda Utilizando RMS para a Persistência de Dados veja só a diferença: o Floggy evita muitas linhas de código, além de ser muito mais fácil e rápido.

Para fazer o download do projeto feito no Netbean clique aqui.

9 comentários:

  • Boa tarde
    Gostaria de saber se ha como organizar os dados, tipo listar por orden alfabética ou por DDD (ex.)

  • Rodolfo

    Olá! É possível organizar os dados sim! Você pode criar um Filtro para encontrar determinados objetos ou usar um método "compare" para fazer a ordenação dos dados encontrados. No link http://www.javamovel.com/2009/06/floggy-framework-de-persistencia-de_2660.html você encontra o funcionamento destes métodos de seleção.

    []'s

  • E ai galera, alguem conhece esse erro?
    net.sourceforge.floggy.persistence.migration.Enumeration
    /home/Tiago/NetBeansProjects/agendafloggy/build.xml:99:
    net.sourceforge.floggy.persistence.WeaverException: net.sourceforge.floggy.persistence.migration.Enumeration
    at net.sourceforge.floggy.persistence.Weaver.execute(Weaver.java:146)
    at net.sourceforge.floggy.persistence.WeaverTask.execute(WeaverTask.java:89)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
    at sun.reflect.GeneratedMethodAccessor451.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:357)
    at org.apache.tools.ant.Target.performTasks(Target.java:385)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1306)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1189)
    at org.apache.tools.ant.module.bridge.impl.BridgeImpl.run(BridgeImpl.java:278)
    at org.apache.tools.ant.module.run.TargetExecutor.run(TargetExecutor.java:498)
    at org.netbeans.core.execution.RunClassThread.run(RunClassThread.java:151)
    Caused by: javassist.NotFoundException: net.sourceforge.floggy.persistence.migration.Enumeration
    at javassist.ClassPool.get(ClassPool.java:417)
    at javassist.CtClassType.subtypeOf(CtClassType.java:301)
    at net.sourceforge.floggy.persistence.Weaver.getClassThatImplementsPersistable(Weaver.java:732)
    at net.sourceforge.floggy.persistence.Weaver.execute(Weaver.java:110)
    ... 16 more
    FALHA NA CONSTRUÇÃO (tempo total: 0 segundos)
    Abrç Tiago

  • Rodolfo

    Tiago, pelo visto o erro "Caused by: javassist.NotFoundException" ocorre porque os JARs do framework não estão configurados devidamente. Para isto veja o post Como configurar o Netbeans para usar Floggy

  • C:\Users\Deivy\Documents\NetBeansProjects\Fin\build.xml:99:
    java.lang.ExceptionInInitializerError
    at net.sourceforge.floggy.persistence.WeaverTask.execute(WeaverTask.java:74)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
    at sun.reflect.GeneratedMethodAccessor260.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:357)
    at org.apache.tools.ant.Target.performTasks(Target.java:385)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1306)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1189)
    at org.apache.tools.ant.module.bridge.impl.BridgeImpl.run(BridgeImpl.java:278)
    at org.apache.tools.ant.module.run.TargetExecutor.run(TargetExecutor.java:498)
    at org.netbeans.core.execution.RunClassThread.run(RunClassThread.java:151)
    Caused by: org.apache.commons.logging.LogConfigurationException: User-specified log class 'net.sourceforge.floggy.persistence.AntLog' cannot be found or is not useable.
    at org.apache.commons.logging.impl.LogFactoryImpl.discoverLogImplementation(LogFactoryImpl.java:798)
    at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:601)
    at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:333)
    at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:307)
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:645)
    at net.sourceforge.floggy.persistence.Weaver.(Weaver.java:62)
    ... 16 more

  • Rafael Toebe

    primeiramente gostaria de elogiar o tutorial, foi de muita ajuda..

    porem quando mando listar os dados eles não se encontram mais armazendos (isso depois de reiniciar o emulador)

    se pude-se me esclarecer agradeceria

  • Rodolfo

    Obrigado Rafael. Realmente, quando o emulador é fechado os dados não persistem. Você chegou a testar no celular?

  • Rafael Toebe

    não não..

    mas já tinha chegado a essa conclusão depois de mecher um pouco com o RMS puro..

    já to desenvolvendo algumas coisinhas usando o Floggy graças a seu artigo..

    obrigado por postar

  • Jhoseph Araujo

    Teria como disponibilizar o código da edição do registro da agenda usando floggy?

  • Postar um comentário