Trazer quantidade de dados getNumRecords

Bom Pessoal estou começando a usar JME e gostaria da ajuda de vcs. é o seguinte estou fazendo uma pequena aplicação com jme usando RecordStore como minha persistencia, conseguir gravar dados, consultar pelo id, mas na hora de listar todos os dados gravado tá dando um erro no getNumRecords ele não retornando a quantidade dos meus dados! Segue o metodo de listar abaixo. agradeço a atenção de todos.

 public String[] retornaPalavras(){

            int total = 0;

            try {
            total = rs.getNumRecords();
         
            } catch (RecordStoreNotOpenException e) {

            }

            String[] registros = new String[total];

            for(int i=1; i < total; i++){

                  String palavra = null;

                  try {

                     palavra = new String(rs.getRecord(i));



                  } catch (RecordStoreNotOpenException e) {

                        e.printStackTrace();

                  } catch (InvalidRecordIDException e) {

                        e.printStackTrace();

                  } catch (RecordStoreException e) {

                        e.printStackTrace();

                  }
                  registros[i-1] = palavra;
            }

            return registros;
}

Qual o erro?

Mesmo antes de ver qual é o erro, eu arrisco dizer que o problema não é com o getNumRecords. Creio que você deva usar RecordEnumeration, pois como você está lendo os dados em sequência, caso um do records tenha sido excluido o RMS dá erro. Por exemplo se i=3 e o record 3 foi deletado.
Tente sempre usar RecordEnumeration para trabalhar com RMS para evitar erros.

Ex:
rs = RecordStore.openRecordStore(store, true);
RecordEnumeration re = rs.enumerateRecords(null, null, false);

Se não for isto, posta o erro ai.
Um abraço.

vc pode fazer da forma acima ou se quiser de uma forma mais direta:

rs.enumerateRecords(null, null, false).numRecords();

já retorna o numero de registros :slight_smile:

abcs

Segue meu erro

TRACE: <at java.lang.NullPointerException: 0>, Exception caught in Display class
java.lang.NullPointerException: 0
at ExibirLista.listarRecorStore(ExibirLista.java:56)
at EventsMidlet.commandAction(EventsMidlet.java:122)
at javax.microedition.lcdui.Display$ChameleonTunnel.callScreenListener(), bci=46
at com.sun.midp.chameleon.layers.SoftButtonLayer.processCommand(), bci=74
at com.sun.midp.chameleon.layers.SoftButtonLayer.soft1(), bci=37
at com.sun.midp.chameleon.layers.SoftButtonLayer.keyInput(), bci=36
at com.sun.midp.chameleon.CWindow.keyInput(), bci=38
at javax.microedition.lcdui.Display$DisplayEventConsumerImpl.handleKeyEvent(), bci=17
at com.sun.midp.lcdui.DisplayEventListener.process(), bci=277
at com.sun.midp.events.EventQueue.run(), bci=179
at java.lang.Thread.run(Thread.java:619)

como eu passaria

rs.enumerateRecords(null, null, false).numRecords(); a quantidade de registros para meu laço?

Pois é, o erro NullPointerException indica que o RMS não tá achando o registro. Como eu disse, você deve usar rs = RecordStore.openRecordStore(store, true);
RecordEnumeration re = rs.enumerateRecords(null, null, false); Daí pra em diante toda navegação que você for fazer no recordstore você usa “re” ao invés de “rs”. Dá uma lida em como trabalhar com RecordEnumeration, é a melhor forma de trabalhar com RMS sem ter que tratar exceções.

Um abraço.

Quanto a esta pergunta você troca:

[code]
try {
total = rs.getNumRecords();
} catch (RecordStoreNotOpenException e) {

 }   [/code]

Por:

[code]
try {
total = rs.enumerateRecords(null, null, false).numRecords();
} catch (RecordStoreNotOpenException e) {

  }   [/code]

Mas de qualquer forma não funciona no seu código, porque (vamos supor que o registro 2 foi deletado) quando você for pesquisar o banco e i=2 vai dar erro. Você tem que usar o RecordEnumeration ou então tratar esta exceção com catch que não é muito prático.

Bom pessoal tentei usar o enumerateRecords como edwagner comentou e infelizmente minha variável está retornando null, Debuguei, e minha variável total não pega valores e outra tentei tb passar direto sem variavel e tb não pega meus valores. Vou colocar minha classe de persistencia pra pedir mais uma vez ajuda a vocês :slight_smile:

[code]/**
*

  • @author maxdavis
    */
    public class Persistencia {

    RecordStore rs ;
    Eventos eventos = new Eventos();
    Display displayLista;
    private String[] lista;

    public byte[] returnArray(Eventos eventos) {
    try {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    DataOutputStream daos = new DataOutputStream(baos);

         daos.writeUTF(eventos.getNomeEvento());
         daos.writeLong(eventos.getDataEvento().getTime());
    
    
         byte[] result = baos.toByteArray();
    
         return result;
    
     } catch (IOException e) {
         e.printStackTrace();
     }
     return null;
    

    }

    public Eventos returnEventos(byte[] a) {
    try {
    ByteArrayInputStream bais = new ByteArrayInputStream(a);
    DataInputStream dais = new DataInputStream(bais);

         String nomeEventos = dais.readUTF();
         long dataEventos = dais.readLong();
         Date dataConvertida = new Date(dataEventos);
    
         Eventos eventos = new Eventos();
         eventos.setNomeEvento(nomeEventos);
         eventos.setDataEvento(dataConvertida);
      
         return eventos;
    
     } catch (IOException e) {
         e.printStackTrace();
     }
     return null;
    

    }

    public void salvar(Eventos eventos) throws RecordStoreException{
    rs = RecordStore.openRecordStore(“Eventos”, true);

    rs.addRecord(returnArray(eventos), 0, returnArray(eventos).length);
    
    rs.closeRecordStore();
    

    }

    public Eventos buscar(int i) throws RecordStoreException{
    rs = RecordStore.openRecordStore(“Eventos”, true);

    eventos = returnEventos(rs.getRecord(i));
    
    rs.closeRecordStore();
    
    return eventos;
    

    }

    public String[] retornaPalavras(){

     int total = 0;
      
       try {
        total = rs.enumerateRecords(null, null, false).numRecords();
      } catch (RecordStoreNotOpenException ex) {
             ex.printStackTrace();
       }
          
    
         String[] registros = new String[total];
    
         for(int i=1; i < total; i++){
    
               String palavra = null;
    
               try {
    
                  palavra = new String(rs.getRecord(i));
    
               } catch (RecordStoreNotOpenException e) {
                     e.printStackTrace();
               } catch (InvalidRecordIDException e) {
                     e.printStackTrace();
               } catch (RecordStoreException e) {
                     e.printStackTrace();
               }
               registros[i-1] = palavra;
         }
    
         return registros;
    

}

}
[/code]

Descobrir o Erro ! :confused: Eu estava esquecendo de inicializar meu RecordStore , Venho agradecer a todos vocês por terem me dado as dicas muito obrigado!

Segue o metodo abaixo como ficou!

[code] public String[] retornaPalavras() throws RecordStoreException{

    rs = RecordStore.openRecordStore("Eventos", true);
    int total = 0;
   
      try {
       total = rs.enumerateRecords(null, null, false).numRecords();
     } catch (RecordStoreNotOpenException ex) {
            ex.printStackTrace();
      }
         
  
        String[] registros = new String[total];

        for(int i=1; i <= total; i++){

              String palavra = null;

              try {

                 palavra = new String(rs.getRecord(i));

              } catch (RecordStoreNotOpenException e) {
                    e.printStackTrace();
              } catch (InvalidRecordIDException e) {
                    e.printStackTrace();
              } catch (RecordStoreException e) {
                    e.printStackTrace();
              }
              registros[i-1] = palavra;
        }

        return registros;

}[/code]

Bom Pessoal o metodo que tinha colocado dará um erro na hora de deletar como EdWagner falou fiz um novo metodo, que não gera esse problema na hora de deletar.

[code]public Eventos[] listaEventosWhile() throws RecordStoreException {
rs = RecordStore.openRecordStore(“Eventos”, true);
int total = 0;
int contador = 0;
total = rs.enumerateRecords(null, null, false).numRecords();

   Eventos[] listaEventos = new Eventos[total];
    recordEnumeration = rs.enumerateRecords(null, null, false);
  try {
    while (recordEnumeration.hasNextElement()) {
       

            String txt;
            eventos = returnEventos(recordEnumeration.nextRecord());

            contador ++;
            listaEventos[contador -1 ]= eventos;
        }
   
        } catch (InvalidRecordIDException ex) {
        System.out.println("-- ID inexistente");
        } catch (RecordStoreNotOpenException ex) {
        System.out.println("-- O Record Store esta fechado");
    }

   rs.closeRecordStore();

    return listaEventos;
}[/code]