Busca no RecordStore

15 respostas
R

ola pessoal toh precisando de uma ajuda, é o seguinte conforme o figura abaixo eu tenho tres registro no Recordstore
[img]http://pics1.frozenbear.com/i/picfu1/2008/07/14/20/2/4/2/2427abc82367d027abb5338e5345072b0_main.jpg[/img]

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:
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");
                }
       }
}

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 ?

15 Respostas

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.

R

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.

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

malves_info
.........  
    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 …

R
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.

N

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.

R

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.

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

R

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.

pq c fazer isso aqui nao da certo ?

P

[quote=Rafael Oliveira da Silva]

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.

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…

R

[quote=boone]

Rafael Oliveira da Silva:
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.

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…

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

P

[quote=Rafael Oliveira da Silva]

boone:
Rafael Oliveira da Silva:
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.

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…

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

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

R

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

P

Rafael Oliveira da Silva:

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

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.

R

fmz eu vou fazer de novo ai eu posto valeu

R

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.

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");
                }
       }
}

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

[img]http://pics1.frozenbear.com/i/picfu1/2008/07/16/16/2/7/1/271802e6072f3fb4be606c68f017f3860_main.jpg[/img]

R

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

Criado 14 de julho de 2008
Ultima resposta 17 de jul. de 2008
Respostas 15
Participantes 4