En este video te explicamos en detalle todo el proceso para publicar una Aplicación Android…
Proyecto Android: implementación de relaciones entre tablas con GreenDAO
2.
Proyecto Android: implementación de relaciones entre tablas con GreenDAO
Continuamos con el Proyecto Android que presentamos en el tutorial anterior de esta serie. Vamos a crear las relaciones entre entidades (tablas) con el ORM GreenDAO, de acuerdo a la estructura de base de datos que diseñamos.
Al final del tutorial puedes descargar todo el código del Proyecto
Recordamos, según la nota que incluimos, que se ha simplificado el modelo de datos para centrar nuestra atención en cómo se definen las relaciones. En este ejemplo un profesor puede impartir hasta tres asignaturas, pero cada asignatura sólo puede ser impartida por un profesor.
Proyecto auxiliar Java «Entidades 1_N»
Método main() Clase Java (proyecto auxiliar Java, para crear los objetos DAO en el proyecto Android):
1 2 3 4 5 6 7 8 9 10 11 12 |
public static void main(String[] args) { try{ Schema schema = new Schema(1,"com.GreenDAO.relacion1_N"); relacionesEntidad(schema); new DaoGenerator().generateAll(schema,"../Relaciones_ORM_GreenDAO/src"); } catch(Exception ex) { System.out.println (ex.getMessage()); } } |
Método para crear las entidades, campo o columnas de tablas, y establecer la relación de 1:N entre las tablas Alumno y Asignaturas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
public static void relacionesEntidad(Schema schema) { try{ //Añadimos la tabla Profesores al Esquema o BD Entity profesores = schema.addEntity("Profesores"); //Creamos un campo ID de tipo autonumérico profesores.addIdProperty(); //Se añaden los campos Nombre, Apellidos y Curso, que no admitirán valores nulos profesores.addStringProperty("Nombre").notNull(); profesores.addStringProperty("Apellidos").notNull(); profesores.addStringProperty("Curso").notNull(); //Añadimos la Tabla Asignaturas al Esquema o BD Entity asignaturas = schema.addEntity("Asignaturas"); //Creamos un campo ID de tipo autonumérico asignaturas.addIdProperty(); //Se añaden los campos Historia, Matemáticas y Lenguaje, que no admitirán valores nulos asignaturas.addBooleanProperty("Historia").notNull(); asignaturas.addBooleanProperty("Matemáticas").notNull(); asignaturas.addBooleanProperty("Lenguaje").notNull(); //Campo que será clave foránea de la tabla Profesores en la Tabla Asignaturas de.greenrobot.daogenerator.Property idProfesor = asignaturas.addLongProperty("idProfesor").getProperty(); //Se establece la relación 1 a varios. Profesores(1) -> Asignaturas(N) ToMany asignaturasAlumno = profesores.addToMany(asignaturas, idProfesor); asignaturasAlumno.setName("asignaturas"); asignaturas.addToOne(profesores, idProfesor); }catch(Exception ex) { System.out.println("Error al crear entidades o establecer relaciones: " + ex.getMessage()); } } |
Estructura de Clases generadas con GreenDAO
- Clase ProfesoresDao.java: clase DAO e interfaz encargada de trabajar con objetos Profesores.
- Clase AsignaturasDao.java: clase DAO e interfaz encargada de trabajar con objetos Asignaturas.
- Clase DaoMaster.java: clase encargada de crear las Tablas y actualizar la versión del esquema sin que nosotros debamos realizar ningún tipo de cambio internamente.
- Clase DaoSession.java: clase encargada de manejar las identidades de objetos, manteniendo la caché de sesión para mejorar el rendimiento.
- Clase Profesores.java y Clase Asignaturas.java: clase encargada de implementar los métodos de acceso get y set, que nos permiten asignar y devolver un valor de un atributo de los objetos Profesores y Asignaturas, proporcionando un grado de encapsulación que restringe el acceso a las variables miembro.
Ejercicio
Crea un ejemplo de estructura de Base de Datos en el que el tipo de relación sea de 1 : N.
Proyecto Android «Relaciones_ORM_GreenDAO»
Variables a nivel de Clase:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[...] private static final String TAG = "Error Guardar: "; private SQLiteDatabase db; private DaoMaster daoMaster; private DaoSession daoSession; private ProfesoresDao profesoresDao; private AsignaturasDao asignaturasDao; private EditText txtNombre; private EditText txtApellidos; private Spinner spinnerCurso; private CheckBox matematicas; private CheckBox historia; private CheckBox lenguaje; [...] |
Método onCreate() donde inicializamos los componentes de la interfaz de usuario, además de crear un Array de String para llenar el componente Spinner:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DevOpenHelper openHelper = new DaoMaster.DevOpenHelper(this, "Matricula", null); db = openHelper.getWritableDatabase(); daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); profesoresDao = daoSession.getProfesoresDao(); asignaturasDao = daoSession.getAsignaturasDao(); txtNombre = (EditText)findViewById(R.id.edNombre); txtApellidos = (EditText)findViewById(R.id.edApellidos); spinnerCurso = (Spinner)findViewById(R.id.edCurso); matematicas = (CheckBox)findViewById(R.id.checkMat); historia = (CheckBox)findViewById(R.id.checkHist); lenguaje = (CheckBox)findViewById(R.id.checkLeng); //Array de String con los cursos a los que impartir clase String[] cursos_coleccion = {"1º E.S.O.","2º E.S.O.","3º E.S.O.","4º E.S.O."}; spinnerCurso.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, cursos_coleccion)); } |
Vemos en esta imagen la interfaz de usuario que vamos a utilizar:
Método guardarDatos(): evento On Click() del botón «Guardar», que nos permitirá almacenar en la Base de Datos «Matrícula», los datos introducidos en los campos de la interfaz de usuario, comprobando previamente que se han introducido el nombre y los apellidos del Profesor, se ha seleccionado un curso al que imparte clase y se ha indicado al menos una asignatura.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
public void guardarDatos(View view) { try{ Asignaturas asignaturas = new Asignaturas(); Profesores profesores = new Profesores(); String nombre = txtNombre.getText().toString(); String apellidos = txtApellidos.getText().toString(); String curso_seleccionado = spinnerCurso.getSelectedItem().toString(); boolean asig_mat = matematicas.isChecked(); boolean asig_leng = lenguaje.isChecked(); boolean asig_hist = historia.isChecked(); //Comprobamos que los campos Nombre y Apellidos no estén vacíos if((nombre.equals(""))) { Toast.makeText(this, "Debe indicar el nombre del Profesor.", 3000).show(); } else if(apellidos.equals("")) { Toast.makeText(this, "Debe indicar el apellido del Profesor.", 3000).show(); } else if(curso_seleccionado.equals("")) { Toast.makeText(this, "Debe indicar el curso al que impartirá clase el Profesor.", 3000).show(); } //Comprobamos que se ha seleccionado al menos una asignatura else if((!asig_mat) && (!asig_hist) && (!asig_leng)) { Toast.makeText(this, "El Profesor debe impartir al menos una asignatura.", 3000).show(); } else { //Asignamos los valores a los atributos del objeto profesores profesores.setNombre(nombre); profesores.setApellidos(apellidos); profesores.setCurso(curso_seleccionado); profesoresDAO.insert(profesores); //Asignamos los valores a los atributos del objeto asignaturas asignaturas.setHistoria(asig_hist); asignaturas.setLenguaje(asig_leng); asignaturas.setMatemáticas(asig_mat); asignaturas.setIdProfesor(profesores.getId()); asignaturasDAO.insert(asignaturas); Toast.makeText(this, "Ficha Profesor->\nNombre y Apellidos: "+ profesores.getNombre() + " " + profesores.getApellidos() + "\nCurso: " + profesores.getCurso(), 10000).show(); //Inicializamos los campos una vez se han guardado los datos txtNombre.setText(""); txtApellidos.setText(""); spinnerCurso.setSelection(0); historia.setChecked(false); lenguaje.setChecked(false); matematicas.setChecked(false); } }catch(Exception ex) { Log.d(TAG,ex.getMessage()); Toast.makeText(this, "No ha sido posible guardar los datos de ficha del Profesor.", 3000).show(); } } |
Ejercicio: con la estructura de Base de Datos creada anteriormente, y con el uso de la API GreenDAO, realiza un proyecto Android, en el que se puedan realizar tareas de consulta e inserción de datos con relaciones de 1:N.
Proyecto «Entidades 1_1»
Para este mismo ejemplo pero estableciendo una relación de 1 : 1 se realizarían los siguientes cambios:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
//Añadimos la tabla Profesores al Esquema o BD. Entity profesores = schema.addEntity("Profesores"); //Creamos un campo ID de tipo autonumérico, que será la clave primaria de la Tabla Profesores. profesores.addIdProperty(); //Se añaden los campos Nombre, Apellidos y Curso, de tipo String, que no admitirán valores nulos. profesores.addStringProperty("Nombre").notNull(); profesores.addStringProperty("Apellidos").notNull(); profesores.addIntProperty("Curso").notNull(); //Añadimos la Tabla Asignaturas al Esquema o BD. Entity asignaturas = schema.addEntity("Asignaturas"); //Creamos un campo ID de tipo autonumérico, que será la clave primaria de la Tabla Asignaturas. asignaturas.addIdProperty(); //Se añaden los campos Historia, Matemáticas y Lenguaje, de tipo Boolean, que no admitirán valores nulos. asignaturas.addBooleanProperty("Historia").notNull(); asignaturas.addBooleanProperty("Matemáticas").notNull(); asignaturas.addBooleanProperty("Lenguaje").notNull(); //Se añadirá un campo que será clave foránea de la tabla Profesores en la Tabla Asignaturas. de.greenrobot.daogenerator.Property idProfesor = asignaturas.addLongProperty("idProfesor").getProperty(); //Se establece la relación 1 a 1. Profesores(1) -> Asignaturas(1).asignaturas.addToOne(profesores, idProfesor); |
En la siguiente imagen presentamos un Diagrama UML o Lenguaje Unificado de Modelado, que nos sirve principalmente como lenguaje gráfico para visualizar, especificar, construir y documentar un sistema. En este diagrama se han definido las Clases, Métodos y Propiedades que intervienen en el proyecto utilizado como ejemplo, para entender el funcionamiento de la API GreenDAO y cómo se establecen las relaciones entre tablas (pincha en la imagen para tener una vista ampliada):
Descarga del Proyecto
Download
Autor: José Antonio Gázquez Rodríguez- Academia Android