Busca no RecordStore

ola pessoal toh precisando de uma ajuda, é o seguinte conforme o figura abaixo eu tenho tres registro no Recordstore

o problema é o seguinte ao recuperar o os registro atravez de uma busca eu nao estou conseguindo lista todos os registros, teria que funcionar da seguinte forma:

ao fazer a busca pelo nome “rafael” a saida teria que ser os tres nomes que estao armazenados no recordstore, mais ao inves disso esta aparecendo apenas dois nomes
segue o codigo abaixo:

[code] try
{
reNomes = rsNomes.enumerateRecords(null, null, false);
}
catch (Exception erro)
{
}
if (reNomes.numRecords()>0)
{
ByteArrayInputStream bStream;
DataInputStream dStream;
String nameRMS = null;
byte [] record = reNomes.nextRecord();
while (reNomes.hasNextElement())
{
bStream = new ByteArrayInputStream (record);
dStream = new DataInputStream (bStream);
nameRMS = dStream.readUTF();

               if (nameRMS.compareTo(tf_Buscar.getString())== 0)
               {
                   findAddress = true;
                 
                   String nameRMS2;
                   nameRMS2 = dStream.readUTF();
                
                   list.append(nameRMS+" - "+nameRMS2,null);
                  
               }
               record = reNomes.nextRecord();
            }
            if (!findAddress)
                System.out.println("nao cadastrado"); 
        }   
            else
            {
                System.out.println("nao cadastrado");
            }
   }

}[/code]

eu acho que isso está acontecendo pq a o vetor record nao está sendo inicializado com o registro do id 0 (linha 13). Sendo assim eu criei um vetor dentro do while (linha14) para reber todos os ids do recordstrore e utilizei o vetIds.elementAt(0) para recuperar o id 0, so q msm assim nao consegui, será que alguem pode me ajudar ?

Vê se essa melhoria ajuda:

.........
if (reNomes.numRecords()>0)  
	      {  
	          ByteArrayInputStream bStream;  
	          DataInputStream dStream;  
	          String nameRMS = null;  
	        
	          while (reNomes.hasNextElement())  
	          {  
	        	 dStream = new DataInputStream(new ByteArrayInputStream(record.getRecord(rsNomes.nextRecordId())));
	        	 nameRMS = dStream.readUTF();  
	             
	               
	             if (nameRMS.compareTo(tf_Buscar.getString())== 0)  
	             {  
	                 findAddress = true;  
	                 
	                 String nameRMS2;  
	                 nameRMS2 = dStream.readUTF();  
	                
	                 list.append(nameRMS+" - "+nameRMS2,null);  
	                  
	             }  
	             record = reNomes.nextRecord();  
	          }  
	          if (!findAddress)  
	              System.out.println("nao cadastrado");   
	      }     
	          else  
	          {  
	              System.out.println("nao cadastrado");  
	          }
..........

O que mudei foi a forma em que vc recupera os bytes.

[quote=malves_info]Vê se essa melhoria ajuda:

.........
if (reNomes.numRecords()>0)  
	      {  
	          ByteArrayInputStream bStream;  
	          DataInputStream dStream;  
	          String nameRMS = null;  
	        
	          while (reNomes.hasNextElement())  
	          {  
	        	 dStream = new DataInputStream(new ByteArrayInputStream(record.getRecord(rsNomes.nextRecordId())));
	        	 nameRMS = dStream.readUTF();  
	             
	               
	             if (nameRMS.compareTo(tf_Buscar.getString())== 0)  
	             {  
	                 findAddress = true;  
	                 
	                 String nameRMS2;  
	                 nameRMS2 = dStream.readUTF();  
	                
	                 list.append(nameRMS+" - "+nameRMS2,null);  
	                  
	             }  
	             record = reNomes.nextRecord();  
	          }  
	          if (!findAddress)  
	              System.out.println("nao cadastrado");   
	      }     
	          else  
	          {  
	              System.out.println("nao cadastrado");  
	          }
..........

O que mudei foi a forma em que vc recupera os bytes.[/quote]

valeuu cara pela resposta, mais eu nao entendi o que vc fez ai nao record é um vetor nao o nome do recordstore, vc utilizou o getRecord em um vetor ?

olha o erro que tah dando

.........  
    if (reNomes.numRecords()>0)    
              {    
                  ByteArrayInputStream bStream;    
                  DataInputStream dStream;    
                  String nameRMS = null;    
                 
                 while (reNomes.hasNextElement())    
                {    
                   dStream = new DataInputStream(new ByteArrayInputStream(rsNomes.getRecord(reNomes.nextRecordId())));  
                    nameRMS = dStream.readUTF();    
                      
                        
                    if (nameRMS.compareTo(tf_Buscar.getString())== 0)    
                    {    
                        findAddress = true;    
                          
                        String nameRMS2;    
                        nameRMS2 = dStream.readUTF();    
                         
                        list.append(nameRMS+" - "+nameRMS2,null);    
                           
                    }    
                    record = reNomes.nextRecord();    
                 }    
                 if (!findAddress)    
                     System.out.println("nao cadastrado");     
             }       
                 else    
                 {    
                     System.out.println("nao cadastrado");    
                 }  
..................

Desculpa errei nessa linha
dStream = new DataInputStream(new ByteArrayInputStream(rsNomes.getRecord(reNomes.nextRecordId())));
a cada interação do “while” crio um novo input , dando um geRecord do proximo id …

try   
{   
     reNomes = rsNomes.enumerateRecords(null, null, false);   
}   
catch (Exception erro)   
{   
}   
     if (reNomes.numRecords()>0)   
     {   
         ByteArrayInputStream bStream;   
         DataInputStream dStream;   
         String nameRMS = null;   
         byte [] record = reNomes.nextRecord();   
         while (reNomes.hasNextElement())   
         {   
            bStream = new ByteArrayInputStream (record);   
            dStream = new DataInputStream (bStream);   
            nameRMS = dStream.readUTF();   
               
            if (nameRMS.compareTo(tf_Buscar.getString())== 0)   
            {   
                findAddress = true;   
                 
                String nameRMS2;   
                nameRMS2 = dStream.readUTF();   
               
                list.append(nameRMS+" - "+nameRMS2,null);   
                 
            }   
            record = reNomes.nextRecord();   
         }   
         if (!findAddress)   
             System.out.println("nao cadastrado");   
     }     
         else   
         {   
             System.out.println("nao cadastrado");   
         }   
}   

nao deu certo nao continuou listando apenas dois registro. agora pouco eu fui ler de novo o topico e percebi que eu nao expliquei direiro agora eu editei o topico. É assim o recordstore tem tres registro iguais soh que quando eu fasso uma busca com o nome do registro a saida eh apenas de dois registro fica faltando um, tah ai desconfinça que esse registro que está faltando está no record do id 0 porque c vc reparar quando eu fasso a busca eu utilizo o nextRecord(); (linha 14) para inicializar o vetor record. eu acho que o certo seria inicializar o vetor record com o record do id 0, soh que o nextRecord nao começa do id 0 neh ? ai eh que ta eu nao sei como fazer para inicializar o vetor record do id 0.

Lembre-se de que o primeiro ID de registro do recordstore é o 1, e não o 0 como você citou.

Sua busca deve iniciar pelo registro 1.

[quote=npereirajr]Lembre-se de que o primeiro ID de registro do recordstore é o 1, e não o 0 como você citou.

Sua busca deve iniciar pelo registro 1.[/quote]

mais o nextRecord(); inicia da onde ? c for do 1 entao era para funcionar perfeitamente soh que nao está listando todos os regitros.

[quote=npereirajr]Lembre-se de que o primeiro ID de registro do recordstore é o 1, e não o 0 como você citou.

Sua busca deve iniciar pelo registro 1.[/quote]

pq c fazer isso aqui nao da certo ?

[quote=Rafael Oliveira da Silva][quote=npereirajr]Lembre-se de que o primeiro ID de registro do recordstore é o 1, e não o 0 como você citou.

Sua busca deve iniciar pelo registro 1.[/quote]

pq c fazer isso aqui nao da certo ?

Pq não é sempre garantido que vá existir no recordstore um registro com ID 1.
Como o id do record é incremental, e este record pode vir a ser deletado, se o for, da próxima vez que vc abrir de novo este recordstore e executar esta linha, é para ganhar uma linda InvalidRecordIDException…

[quote=boone][quote=Rafael Oliveira da Silva][quote=npereirajr]Lembre-se de que o primeiro ID de registro do recordstore é o 1, e não o 0 como você citou.

Sua busca deve iniciar pelo registro 1.[/quote]

pq c fazer isso aqui nao da certo ?

Pq não é sempre garantido que vá existir no recordstore um registro com ID 1.
Como o id do record é incremental, e este record pode vir a ser deletado, se o for, da próxima vez que vc abrir de novo este recordstore e executar esta linha, é para ganhar uma linda InvalidRecordIDException…[/quote]

entao como q eu fasso para inicializar o vetor record com o record do id 1 ?

[quote=Rafael Oliveira da Silva][quote=boone][quote=Rafael Oliveira da Silva][quote=npereirajr]Lembre-se de que o primeiro ID de registro do recordstore é o 1, e não o 0 como você citou.

Sua busca deve iniciar pelo registro 1.[/quote]

pq c fazer isso aqui nao da certo ?

Pq não é sempre garantido que vá existir no recordstore um registro com ID 1.
Como o id do record é incremental, e este record pode vir a ser deletado, se o for, da próxima vez que vc abrir de novo este recordstore e executar esta linha, é para ganhar uma linda InvalidRecordIDException…[/quote]

entao como q eu fasso para inicializar o vetor record com o record do id 1 ?[/quote]

A chave de tudo é sempre usar a enumeração (enumerateRecords e nextRecordId) para popular o vetor com os IDs.

ah tah, mais eu jah fiz isso ja e depois utilizei o vetIds.elementAt() para recuperar o id mais continuou listando apenas dois regitros ai inves dos tres

[quote=Rafael Oliveira da Silva][quote]
A chave de tudo é sempre usar a enumeração (enumerateRecords e nextRecordId) para popular o vetor com os IDs.
[/quote]

ah tah, mais eu jah fiz isso ja e depois utilizei o vetIds.elementAt() para recuperar o id mais continuou listando apenas dois regitros ai inves dos tres[/quote]

Cara…posta os 2 trechos de código:

:arrow: O laço while onde vc percorre a enumeração e preenche o vetIds
:arrow: O trecho onde usa o elementAt

Só vendo o que vc está fazendo é que dá para apontar o erro.

fmz eu vou fazer de novo ai eu posto valeu

[code]public void Busca () throws RecordStoreException, IOException
{
// Recupera os registros usando enumeração
try
{
reNomes = rsNomes.enumerateRecords(null, null, false);
}
catch (Exception erro)
{
}

        if (reNomes.numRecords()>0)
        {
            ByteArrayInputStream bStream;
            DataInputStream dStream;
            String nameRMS = null;
            
            byte [] record;
            int id = reNomes.nextRecordId(); 
            vetIds.addElement(""+id);
            record = rsNomes.getRecord(Integer.parseInt(vetIds.elementAt(1).toString()));
            
            while (reNomes.hasNextElement())
                
            {
               bStream = new ByteArrayInputStream (record);
               dStream = new DataInputStream (bStream);
               nameRMS = dStream.readUTF();
               
               if (nameRMS.compareTo(tf_Buscar.getString())== 0)
               {
                   findAddress = true;
                 
                   String nameRMS2;
                   nameRMS2 = dStream.readUTF();
                
                   list.append(nameRMS+" - "+nameRMS2,null);
                  
               }
               record = reNomes.nextRecord();
            }
            if (!findAddress)
                System.out.println("nao cadastrado"); 
        }   
            else
            {
                System.out.println("nao cadastrado");
            }
   }

}[/code]

adicionei as linha 18, 19, 20 e 21 so q msm assim apos a busca no recordstrore so é exibido dois registro ao inves dos tres, veja na figura abaixo

consegui foi q nem o npereirajr falou.

simples rsrsrs

byte [] record = rsNomes.getRecord(1);

a busca deve começar do id 1

funcionou, aparentemente rsrsrs