Test Foro de elhacker.net SMF 2.1

Programación => Programación General => Java => Mensaje iniciado por: mgc en 26 Febrero 2015, 10:37 AM

Título: Filtro en J2ME
Publicado por: mgc en 26 Febrero 2015, 10:37 AM
Hola,
Tengo que buscar un cliente determinado en un RecordStore, y lo quiero hacer con un filtro así:

import javax.microedition.rms.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;

public class ExampleSearch
{

private RecordStore recordstore = null;
private RecordEnumeration recordEnum= null;
private Filter filter = null;

// get the record store
public void getRecStore(){
recordstore= RecordStore.openRecordStore("myRec",true);
}
//
public boolean login(String userName,String password){
getRecStore();
filter = new Filter(userName+"#"+password); // create a filter on the search text
recordEnum= recordstore.enumerateRecords(filter, null, false);
if (recordEnum.numRecords() > 0)
{
return true;
}else{
return false;
}
}

}


/*
*    This class is used as a filter for this example which is exetnding the RecordFilter
*
*
*/
class Filter implements RecordFilter{
private String search = null;
private ByteArrayInputStream inputstream = null;
private DataInputStream datainputstream = null;
public Filter(String search)
{
this.search = search.toLowerCase();
}
public boolean matches(byte[] suspect)
{
String string = new String(suspect).toLowerCase();
if (string!= null && string.indexOf(search) != -1)
return true;
else
return false;
}
public void filterClose()
{
try
{
if (inputstream != null)
{
inputstream.close();
}
if (datainputstream != null)
{
datainputstream.close();
}
}
catch ( Exception error)
{
}
}
}


Lo que no se, es cómo llevarlo a cabo, porque si utilizo el método public boolean login(String userName,String password), me devuelve true, pero yo lo que quiero mostrar es el detalle de los datos del cliente.
¿Alguien me puede decir cómo hacerlo?

Gracias de antemano y un saludo.
Título: Re: Filtro en J2ME
Publicado por: Usuario Invitado en 26 Febrero 2015, 14:57 PM
Título: Re: Filtro en J2ME
Publicado por: mgc en 26 Febrero 2015, 15:42 PM
Te especifico algo más mi caso, porque yo las consultas no las hago a una base de datos, si no al propio RecordStore que es quien me almacena los registros.
Cada registro del RecordStore, será un cliente con su nombre y password.
Los clientes los muestro en una lista por su nombre, y seleccionándolos puedo ver el detalle (nombre y contraseña).
El constructor de la clase sería:
public bdClientes(String nombre){
       super(nombre,List.IMPLICIT);
   }


Cada registro tendrá será un String de esta forma nombre:password
El método que muestra la lista por pantalla sería este:
public void listarClientes(){
       //super.deleteAll();
       try {
           almacen= RecordStore.openRecordStore("Clientes", true);
           enumeracion=almacen.enumerateRecords(null, null, true);
           int numRegistros=0;
           
           //recorremos los registros con el enumerador
           while(enumeracion.hasNextElement()){
              // int id=enumeracion.nextRecordId();
               String registro=new String(enumeracion.nextRecord());
               numRegistros++;

               int separador=registro.indexOf(":");

               String nombre=registro.substring(0, separador);

               String password=registro.substring(separador+1);

               super.append(nombre, null);
           }
         
           //cerramos el almacen de registros
           almacen.closeRecordStore();
       } catch (RecordStoreException ex) {
           ex.printStackTrace();
       }
   }


Lo que quiero es mostrar los datos del Cliente seleccionado de esta lista.

El registro seleccionado de la lista sería este:

String registroLista=super.getString(super.getSelectedIndex());


Mi idea es buscar en el RecordStore el registro que coincide con registroLista.

Espero que esté claro al menos, mis intenciones. Mi problema es que no se llevar a cabo el Filter, en este caso.

Gracias y saludos.
Título: Re: Filtro en J2ME
Publicado por: Usuario Invitado en 26 Febrero 2015, 16:45 PM
No he tocado en mi vida Java ME :xD, pero por lógica viendo el código y lo que me has enseñado (gracias ^^), obtendría los detalles del cliente seleccionado así:

Código (java) [Seleccionar]
public String getClientDetails(String name) {
try {
           stock = RecordStore.openRecordStore("Clientes", true);
           enumeracion=almacen.enumerateRecords(null, null, true);
           int clients = 0;
           
           while(enumeracion.hasNextElement()){
              // int id=enumeracion.nextRecordId();
               String client =new String(enumeracion.nextRecord());
String[] clientData = client.split(":");
if(clientData[0].equals(name)) {
return client;
}
               clients++;

           }
         
       } catch (RecordStoreException ex) {
           ex.printStackTrace();
       } finally {
           almacen.closeRecordStore();
}

}


Donde:

Título: Re: Filtro en J2ME
Publicado por: mgc en 26 Febrero 2015, 17:02 PM
¿Es posible que split no se pueda utilizar en j2me?
Te adjunto captura.
(http://sia1.subirimagenes.net/img/2015/02/26/150226050139433433.jpg) (http://www.subirimagenes.net/i/150226050139433433.jpg)


Muchas gracias, saludos.
Título: Re: Filtro en J2ME
Publicado por: Usuario Invitado en 26 Febrero 2015, 17:17 PM
Por lo visto JavaME no soporta el método split de String. Pero siempre podemos improvisar ;)

Código (java) [Seleccionar]
int separator = client.indexOf(":");
    String username = client.substring(0,separator);
    String password = client.substring(separator+1);
Título: Re: Filtro en J2ME
Publicado por: mgc en 26 Febrero 2015, 17:26 PM
Tras hacer los cambios este sería el código,
Utilizo un método para devolver el nombre y otro para devolver el password, que debo insertarlos en campos diferentes en el display.

¿Cómo lo ves?

    public String getClientPass(String name) throws RecordStoreException {
        String pass="";
        try {
            almacen = RecordStore.openRecordStore("Clientes", true);
            enumeracion = almacen.enumerateRecords(null, null, true);
            int clients = 0;

            while (enumeracion.hasNextElement()) {
                // int id=enumeracion.nextRecordId();
                String client = new String(enumeracion.nextRecord());
                int separator = client.indexOf(":");
                String username = client.substring(0, separator);
                String password = client.substring(separator + 1);
                //String[] clientData = client.split(":");
                if (username.equals(name)) {
                    // muestras los detalles del cliente
                    pass = password;
                }
                clients++;
            }

        } catch (RecordStoreException ex) {
            ex.printStackTrace();
        } finally {
            almacen.closeRecordStore();
        }
        return pass;
    }
Título: Re: Filtro en J2ME
Publicado por: Usuario Invitado en 26 Febrero 2015, 17:35 PM
Eso ya depende de tu lógica de negocio ^^. Sólo una observación, sería más lógico inicializar pass en null, cosa que luego comparamos if(getClientPass(username) == null) para saber si se ha encontrado el cliente, en lugar de if(getClientPass(username).isEmpty()).

El resto, lo veo bien. Si fui de ayuda y resolviste tu problema, por favor marca el título del tema con un check verde. ¡Un saludo!
Título: Re: Filtro en J2ME
Publicado por: mgc en 26 Febrero 2015, 17:44 PM
Muchas gracias por todo, yo creo que si está resuelto, ahora me queda ponerlo todo en su sitio y que funcione... Estoy iniciándome en esto, y todo me cuesta un mundo.

Saludos.