domingo, 20 de mayo de 2012

J2MEMicroDB

En este tutorial vamos a desarrollar una base de datos en un movil, pero primero debemos conocer sobre J2ME asi que les dejo un link sobre un tutorial de J2ME.

http://mygnet.net/manuales/j2me//tutorial_j2me_el_mejor_que_he_visto.370


Ahora vamos con las herramientas que vamos a emplear, primero necesitamos una plataforma de desarrollo asi que trabajaremos con Netbeans y les dejo el link de descarga.


Después de haber descargado el IDE o plataforma de desarrollo vamos a crear un proyecto, cuando abrimos el Netbeans le damos nuevo proyecto--después buscamos la carpeta que dice Jave ME--le damos click y seleccionamos Mobile Application.

Le damos un nombre al proyecto, en mi caso se llama PrototipoPersona.
Ahora vamos a trabajar con un API que encontré en mi investigación, que hace este API me permite crear una base de datos y de una forma muy sencilla.
Este APi se llama J2MEMicroDB nos permite trabajar con tablas relacionales y sin necesidad de tanto codigo :) les dejo un link de la pagina WikiDataLIB

Y este link es de mi auto ria ya que subí el api en mediafire para descarga de una manera mas sencilla


Ya descargado el api lo primero que debemos hacer es incluirlo en nuestro proyecto, en la parte donde se creo el proyecto ahi tres paquetes el Source Packages el Resurces y ProjectConfigurations, en Resource le damos click derecho y nos tiene que salir la opción Add library.
Lo siguiente es darle en Edit para poder agregar la librería nos tiene que salir lo siguiente.

le dan New Library  ahí le ponen un nombre a la librería y le agrega el classpath, sources y javadoc para agregarlos en el boton de AddJar/Folder. En el link anterior donde esta el api esta el classpath = J2MEMicroDBv10.jar , sources = J2MEMicroDBSource.zip y el javadoc = J2MEMicroDBJavaDoc.zip
le damos ok, ahora buscamos la librería que editamos, en mi caso se llama myLibrary y le damos addLibrary, y listo ahora ya tenemos la librería necesaria para este proyecto.
Ahora vamos a crear una clase Persona con sus atributos, constructores y métodos, queda así la clase.
Los últimos métodos que se generan por la implements de la PDAStoreable no es necesaria así que en mi caso lo deje en blanco, ahora debemos crear una clase que maneje los servicios que se van usar con la persona por ejemplo crear, actualizar y borrar una persona así que en este caso se implementa el método pero no de la misma manera que estar trabajando con la lógica de negocio de un sistema si no que se implementa poniendo columnas y filas ahí se crean las columnas que van a utilizar en la base de datos.

Crear persona Método :

Nueva persona:
Método getPersonas:
método getPersona: 

Método DeletePersona:


Método Actualizar Persona:

Después de estos métodos que nos hacen un CRUD a la base de datos ahora vamos a crear unos métodos propios del API les pongo algunos pero todos son de la misma forma así que :):

Ahora vamos a la clase MIDlet como saben la clase midlet es la parte donde maneja la GUI de los programas que se desarrollan en J2ME asi que sin mas rodeo veamos el codigo.

Estos primeros son los atributos que vamos a manejar, ahí se encuentren Form=formularios los Button= botones y et.
Despues de nombrarlos con ellos crearemos los formularios todo lo que necesite como interfaz grafica de usuario.
Ahora empezemos a trabajar con el primer Form en este Form vamos agregar una tabla donde cada vez que le demos crear persona se muestre en la tabla, y tambien un menu de crear, buscar.
Primer Form MainForm:
















El siguiente Método es la tabla que va registrar las personas.

















toca inicializar la tabla asi que se muestra en lo siguiente:

String[][] initTable(){
        rows = 0;
        Vector personas;
        try {
            personas = listaPersonas.getPersonas();
             if(personas != null){
           int NumeroPersonas = personas.size();
           String [][] data = new String[NumeroPersonas][9];
           for( int i = 0; i < personas.size(); i++){
               J2MERow row = (J2MERow)personas.elementAt(i);
                   String nombre = listaPersonas.getNombre(row);
                   data[rows][cols] = nombre;
                   cols++;
                   String cedula = listaPersonas.getCedula(row);
                   data[rows][cols] = cedula;
                   cols++;
                   String edad = listaPersonas.getEdad(row);
                   data[rows][cols] = edad;
                   cols++;
                   String telefono = listaPersonas.getTelefono(row);
                   data[rows][cols] = telefono;
                   String fechaNacimiento = listaPersonas.getFechaNacimiento(row);
                   data[rows][cols] = fechaNacimiento;
                   cols++;
                   String peso = listaPersonas.getPeso(row);
                   data[rows][cols] = peso;
                   cols++;
                   String ciudad = listaPersonas.getCiudad(row);
                   data[rows][cols] = ciudad;
                   cols++;
                   String provincia = listaPersonas.getProvincia(row);
                   data[rows][cols] = provincia;
                   cols++;
                   String pais = listaPersonas.getPais(row);
                   data[rows][cols] = pais;
                   rows++;
                   cols=0;
             
                }
                return data;
             }
        } catch (J2MEDBException ex) {
            ex.printStackTrace();
        }
         return null;
        }
No me cabía todo en la imagen así que la copie para que ustedes vean como debe quedar.
Lo que sigue son los comandos para salir, buscar, y crear.
























Ahora el diseño de la tabla con sus respectivas columnas y filas :



 public org.netbeans.microedition.lcdui.SimpleTableModel getSimpleTableModel1() {
        if (simpleTableModel1 == null) {                      
            simpleTableModel1 = new org.netbeans.microedition.lcdui.SimpleTableModel();                      
            simpleTableModel1.setValues(new String[][] {
                new String[] {
                    null,null,null,null,null,
                    null,null,null,null,
                },
                new String[] {
                    null,null,null,null,null,
                    null,null,null,null,
                },
                new String[] {
                    null,null,null,null,null,
                    null,null,null,null,
                },
                new String[] {
                   null,null,null,null,null,
                    null,null,null,null,
                },
            });
            simpleTableModel1.setColumnNames(new String[] {
                "Nombre",
                "Cedula",
                "Edad",
                "Telefono",
                "Fecha de nacimiento",
                "Peso",
                "Ciudad",
                "Provincia",
                "Pais",
            });                    
           String[][] data=initTable();
           if (data!=null)
              simpleTableModel1.setValues(data);
        }                      
        return simpleTableModel1;
    }

Y listo tenemos creada el form de inicio, el manejo de form  si quieren agregarles mas cosas es cuestión de ustedes ya que solo mostrare los formularios y como se queda guardado en una base de datos del celular la cuestión de diseño se las dejo a su imaginación.
Siguiendo con lo nuestro vamos al formulario de crear persona.
























Y los botones que se van agregar en el formulario de crear o nueva persona.


  public void clearNuevaPersonaForm() {
     
        if(TextFieldNombre != null)
            TextFieldNombre.setString("");
         if(TextFieldCedula != null)
            TextFieldCedula.setString("");
        if(TextFieldEdad != null)
            TextFieldEdad.setString("");
        if(TextFieldTelefono != null)
            TextFieldTelefono.setString("");
        if(TextFieldFechaNacimiento != null)
            TextFieldFechaNacimiento.setString("");
        if(TextFieldPeso != null)
            TextFieldPeso.setString("");
        if(TextFieldCiudad != null)
            TextFieldCiudad.setString("");
        if(TextFieldProvincia != null)
            TextFieldProvincia.setString("");
        if(TextFieldPais != null)
            TextFieldPais.setString("");
    }


   
    public TextField getTextFieldNombre() {
       if(TextFieldNombre == null){
          TextFieldNombre = new TextField("Nombre", null, 100, TextField.ANY);
       }
     
       return TextFieldNombre;
    }
   
   
    public TextField getTextFieldCedula() {
       if(TextFieldCedula == null){
          TextFieldCedula = new TextField("Cedula", null, 100, TextField.ANY);
       }
     
       return TextFieldCedula;
    }


    public TextField getTextFieldEdad() {
        if(TextFieldEdad == null){
           TextFieldEdad = new TextField("Edad", null, 100, TextField.ANY);
        }
       
        return TextFieldEdad;
    }


    public TextField getTextFieldTelefono() {
        if(TextFieldTelefono == null){
           TextFieldTelefono = new TextField("Telefono", null, 100, TextField.ANY);
        }
       
        return TextFieldTelefono;
    }


    public TextField getTextFieldFechaNacimiento() {
        if(TextFieldFechaNacimiento == null){
           TextFieldFechaNacimiento = new TextField("Fecha de nacimiento", null, 100, TextField.ANY);
        }
       
        return TextFieldFechaNacimiento;
    }


    public TextField getTextFieldPeso() {
        if(TextFieldPeso == null){
           TextFieldPeso = new TextField("Peso", null, 100, TextField.ANY);
        }
       
        return TextFieldPeso;
    }


    public TextField getTextFieldCiudad() {
        if(TextFieldCiudad == null){
           TextFieldCiudad = new TextField("Ciudad", null, 100, TextField.ANY);
        }
       
        return TextFieldCiudad;
    }


    public TextField getTextFieldProvincia() {
        if(TextFieldProvincia == null){
           TextFieldProvincia = new TextField("Provincia", null, 100, TextField.ANY);
        }
       
        return TextFieldProvincia;
    }


    public TextField getTextFieldPais() {
       if(TextFieldPais == null){
          TextFieldPais = new TextField("Pais", null, 100, TextField.ANY);
       }
     
       return TextFieldPais;
    }


    public Command getCancelCommand1() {
       if(cancelCommand1 == null){
          cancelCommand1 = new Command("salir", Command.CANCEL, 1);
       }
     
       return cancelCommand1;
    }


    public Command getAgregar() {
       if(agregar == null){
          agregar = new Command("Agregar","Agregar", Command.OK, 1);
       }
     
       return agregar;
    }

Y siguiendo con lo anterior vamos con los métodos para editar la persona, no les pondré imagen ya no me caben por que son varios métodos:

/**
     * Actualizar persona
     * @return 
     */
    public Form getEditarPersonaForm() {
        if(editarPersonaForm == null){
           editarPersonaForm = new Form(null, new Item[]{
              getStringItemNombre2(),
              getTextFieldCedula2(),
              getTextFieldEdad2(),
              getTextFieldTelefono2(),
              getTextFieldFechaNacimiento2(),
              getTextFieldPeso2(),
              getTextFieldCiudad2(),
              getTextFieldProvincia2(),
              getTextFieldPais2()   
                     
           });
           
           editarPersonaForm.addCommand(getCancelEditar());
           editarPersonaForm.addCommand(getOkEdit());
           editarPersonaForm.setCommandListener(this);
           editarPersonaForm.setTitle(" Actualizar Persona ");
           
        }
        return editarPersonaForm;
    }


    public Command getCancelEditar() {
        if(cancelEditar == null){
           cancelEditar = new Command("Salir","Salir", Command.CANCEL, 1);
        }
        return cancelEditar;
    }

   
    
    public StringItem getStringItemNombre2() {
       if(stringItemNombre2 == null){
          stringItemNombre2 = new StringItem("Nombre", "< Texto >");
       }
       
       return stringItemNombre2;
    }
        
   public TextField getTextFieldCedula2() {
       if(TextFieldCedula2 == null){
          TextFieldCedula2 = new TextField("Cedula", null, 100, TextField.ANY);
       }
       
       return TextFieldCedula2;
    }

    public TextField getTextFieldEdad2() {
        if(TextFieldEdad2 == null){
           TextFieldEdad2 = new TextField("Edad", null, 100, TextField.ANY); 
        }
        
        return TextFieldEdad2;
    }

    public TextField getTextFieldTelefono2() {
        if(TextFieldTelefono2 == null){
           TextFieldTelefono2 = new TextField("Telefono", null, 100, TextField.ANY);
        }
        
        return TextFieldTelefono2;
    }

    public TextField getTextFieldFechaNacimiento2() {
        if(TextFieldFechaNacimiento2 == null){
           TextFieldFechaNacimiento2 = new TextField("Fecha de nacimiento", null, 100, TextField.ANY);
        }
        
        return TextFieldFechaNacimiento2;
    }

    public TextField getTextFieldPeso2() {
        if(TextFieldPeso2 == null){
           TextFieldPeso2 = new TextField("Peso", null, 100, TextField.ANY);
        }
        
        return TextFieldPeso2;
    }

    public TextField getTextFieldCiudad2() {
        if(TextFieldCiudad2 == null){
           TextFieldCiudad2 = new TextField("Ciudad", null, 100, TextField.ANY);
        }
        
        return TextFieldCiudad2;
    }

    public TextField getTextFieldProvincia2() {
        if(TextFieldProvincia2 == null){
           TextFieldProvincia2 = new TextField("Provincia", null, 100, TextField.ANY);
        }
        
        return TextFieldProvincia2;
    }

    public TextField getTextFieldPais2() {
       if(TextFieldPais2 == null){
          TextFieldPais2 = new TextField("Pais", null, 100, TextField.ANY);
       }
       
       return TextFieldPais2;
    }

    public Command getOkEdit() {
        if(okEdit == null){
           okEdit = new Command("Ok", Command.OK, 1);
        }
        
        return okEdit;
    }

Después de haber hecho el de editar vamos a crear el de mostrar y borrar.


    public Form getPersonaDatosForm() {
        if(personaDatosForm == null ){
           personaDatosForm = new Form(null, new Item[]{
               getStringItemNombre(),
               getStringItemCedula(),
               getStringItemEdad(),
               getStringItemTelefono(),
               getStringItemFechaNacimiento(),
               getStringItemPeso(),
               getStringItemCiudad(),
               getStringItemProvincia(),
               getStringItemPais()
           });
           
           personaDatosForm.addCommand(getok());
           personaDatosForm.addCommand(getBorrar());
           personaDatosForm.addCommand(getEditar());
           personaDatosForm.addCommand(getSalirDatosPersonas());
           personaDatosForm.setCommandListener(this);
           personaDatosForm.setTitle(" Datos de la persona ");
        }
        
        return personaDatosForm;
        
    }
  


    public StringItem getStringItemNombre() {
       if(stringItemNombre == null){
          stringItemNombre = new StringItem("persona nombre", "< Texto >");
       }
       
       return stringItemNombre;
    }


    public StringItem getStringItemCedula() {
       if(stringItemCedula == null){
          stringItemCedula = new  StringItem("personas cedula", "< Texto >");
       }
       
       return stringItemCedula;
    }


    public StringItem getStringItemEdad() {
        if(stringItemEdad == null){
           stringItemEdad = new StringItem("personas edad", "< Texto >");
        }
        
        return stringItemEdad;
    }


    public StringItem getStringItemTelefono() {
        if(stringItemTelefono == null){
           stringItemTelefono = new StringItem("Personas telefonos", "< Texto >");
        }
        
        return stringItemTelefono;
    }


      
    public StringItem getStringItemFechaNacimiento() {
        if(stringItemFechaNacimiento == null){
           stringItemFechaNacimiento = new StringItem("Persona fecha de nacimeinto", "< Texto >");
        }
        
        return stringItemFechaNacimiento;
    }


    private StringItem getStringItemPeso() {
        if(stringItemPeso == null){
           stringItemPeso = new StringItem("Persona peso", "< Texto >"); 
        }    
        
        return stringItemPeso;
    }
    
    public StringItem getStringItemCiudad() {
        if(stringItemCiudad == null){
           stringItemCiudad = new StringItem("Persona ciudad", "< texto >");
        }
        
        return stringItemCiudad;
    }


    
    public StringItem getStringItemProvincia() {
        if(stringItemProvincia == null){
           stringItemProvincia = new StringItem("Persona provincia", "< Texto >");
        }
        return stringItemProvincia;
    }


    public StringItem getStringItemPais() {
        if(stringItemPais == null){
           stringItemPais = new StringItem("Personas pais", "< Texto >");
        }
        return stringItemPais;
    }
    
    public Command getEditar() {
       if(editar == null){
          editar = new Command("Editar","Editar", Command.OK, 1);
       }
       
       return editar;
    }


    public Command getok() {
        if(ok == null){
           ok = new Command("ok", "ok", Command.OK, 1);
        }
        
        return ok;
    }
    
      public Command getBorrar() {
        if(borrar == null){
           borrar = new Command("borrar persona","borrar persona", Command.OK, 1);
        }
        
        return borrar;
    }
      
    public Command getSalirDatosPersonas() {
        if(salirDatosPersonas == null){
           salirDatosPersonas = new Command("Salir", "Salir", Command.CANCEL, 1);
        }
        
        return salirDatosPersonas;
    }

Y por ultimo el método que nos va a votar los alertas:


  public void showAlert(String err) {
         Alert a = new Alert("");
        a.setString(err);
        a.setTimeout(Alert.FOREVER);
        a.setType(AlertType.WARNING);
        //Display d=getDisplay();
         getDisplay().setCurrent(a);    
         destroyApp(false);
    }


Si tienen alguna duda o quieren ver el código completo les subiré un link donde esta el proyecto y me pueden preguntar, al final tiene que dar algo por este estilo.


















































Si necesitan algo les dejo mi correo por si necesitan ayuda en algo.

reinaldojaimes@unisangil.edu.co

Cemente su comentario es importante para aprender :D



14 comentarios:

  1. Genial justo lo que buscaba sigue con esto de las base de datos internas sobre esto no ahi nada bien explicado y en español menos. te lo digo yo que llevo 2 años buscando e investigando sobre bases de datos para j2me y fremworks rms. Pero gracias por el tutorial voy a calar el codigo en estos dias y te cuento como me fue. A y GRACIAS!!!

    ResponderEliminar
    Respuestas
    1. muchas gracias a ustd por tomarse el tiempo de leer este blogg que lo hice con el fin de facilitar a los interesados en trabajar con J2ME

      Eliminar
    2. Hola, ya pase el codigo pero me marca un error en el metodo initTable() y con razon porque no aparece por ningun lado entonces mi duda es si se te paso ponerlo o esta en la libreria de j2memicrodb y si se te paso me lo podrias proporsionar por favor. Gracias

      Eliminar
    3. En realidad tengo duda en varios pedasos me podrias proporcionar el link que mencionas donde esta el codigo completo por favor para ver bien dode es que ahi dudas porque asi no se si le falta codigo o soy yo. Gracias.

      Eliminar
    4. te doy el link de donde encontre este API pero el codigo completo esta en el source de j2memicrodb ahi esta un ejemplo mas claro

      Eliminar
  2. mmmm el error es en el midlet

    seguro que no as escrito el metodo initTablet()
    String[][] initTable(){
    rows = 0;
    Vector personas;
    try {
    personas = listaPersonas.getPersonas();
    if(personas != null){
    int NumeroPersonas = personas.size();
    String [][] data = new String[NumeroPersonas][9];
    for( int i = 0; i < personas.size(); i++){
    J2MERow row = (J2MERow)personas.elementAt(i);
    String nombre = listaPersonas.getNombre(row);
    data[rows][cols] = nombre;
    cols++;
    String cedula = listaPersonas.getCedula(row);
    data[rows][cols] = cedula;
    cols++;
    String edad = listaPersonas.getEdad(row);
    data[rows][cols] = edad;
    cols++;
    String telefono = listaPersonas.getTelefono(row);
    data[rows][cols] = telefono;
    String fechaNacimiento = listaPersonas.getFechaNacimiento(row);
    data[rows][cols] = fechaNacimiento;
    cols++;
    String peso = listaPersonas.getPeso(row);
    data[rows][cols] = peso;
    cols++;
    String ciudad = listaPersonas.getCiudad(row);
    data[rows][cols] = ciudad;
    cols++;
    String provincia = listaPersonas.getProvincia(row);
    data[rows][cols] = provincia;
    cols++;
    String pais = listaPersonas.getPais(row);
    data[rows][cols] = pais;
    rows++;
    cols=0;

    }
    return data;
    }
    } catch (J2MEDBException ex) {
    ex.printStackTrace();
    }
    return null;
    }

    ResponderEliminar
    Respuestas
    1. si seguro de hecho en ese codigo que pones me marca error en varias partes como en la variable row pero se quita si le pongo int antes del row=0; y en los get asi como en la listaPersonas que se soluciona al poner String[][] listaPersonas= initTable();

      Eliminar
  3. puedes darme tu correo y te paso todo el MIdlet
    y lo miras detenidamente, crei que el error era mio pero estube compilando pero no es eso, si no que no puse la mayor parte del midlet por que se me alarga el blog pero voy a subir un link donde este el codigo completo.

    ResponderEliminar
    Respuestas
    1. si esta bien mi correo es doculices@gmail.com y ya supe como era ese pedaso esque String[][] initTable() es el metodo peero de todas formas falta listaPersonas.

      Eliminar
  4. Gracias, tenias razon te falto poner mucho codigo veo que no implementaste todo asi que apartir de hoy me dedicare a implementar lo que tienes ahi y no pusiste y a acoplarlo a mis necesidades y de nuevo gracias y sigue asi como ya habia mencionado no ahi mucho sobre esto, por lo que es una gran contribucion.

    ResponderEliminar
  5. les dejo el codigo fuente en los siguientes link
    http://www.mediafire.com/?5oc3h321i9gbwc9
    http://www.mediafire.com/?ds466z6xjrwsjbd
    http://www.mediafire.com/?61cxkzok2k12xqy

    en estos link estan compuesta por la clase persona, despues por administrar persona donde se encuentran los servicios, y por ultimo el midlet.

    ResponderEliminar
    Respuestas
    1. Que tal Andreix, muchas gracias por tú aportación esta muy interesante.
      Con una molestia, el último link de descarga donde estaría el midlet, está incorrrecto, me manda a un archivo llamado ConexionBDDataSource. Me podrías hacer favor de pasarme el link correcto para analizar el código. Muchas gracias por tú atención.

      Eliminar
  6. Hola, aqui molestando otra vez, con una duda sobre j2memicrodb, esque antes de bajar la libreria en tu blog le habia mandado un mensaje a ludo (uno de los creadores) diciendole que el enlace de su blog estaba caido que sino me podria pasar el j2memicrodb y luego de un rato me contesto y me paso el nuevo enlace en donde una de las cosas que se podian descargar era un zip con lo necesario para conectarse y otro para hacer backup y restore. Y bueno mi duda es si no sabras como integrar la de backuprestore a las librerias porque es un simple .java y memarca algunos errores como que necesita estar integradoa las demas librerias.

    ResponderEliminar
  7. Andreix todavia tienes el midlet de este codigo?(dan_je@hotmail.com)

    ResponderEliminar