Cita:
Iniciado por esebayolo Hola, tengo un problema al eliminar de un arrayList. Os cuento, para crear un objeto de la clase Profesor accedo a la tabla Profesor para recoger los datos de los profesores y despues hago un inner join entre dos tablas para tener las materias que da cada profesor. Todo esto lo hace bien porque cuando yo imprimo por pantalla la linea que veis muestra los datos perfectamente, el problema es que en otro método en el cual accedo a estos objetos, lo datos(nombre, dni...) lo muestra bien, pero cuando accedo al arraylist del objeto profesor(la lista de materias) me dice que está vacío.
El problema creo que es cuando elimino del arraylist, ya que si quito esa parte lo que hace en esa otra función es mostrarme las materias que dan TODOS los profesores, es decir añade las de un profesor encima de otro(por eso cuando cambia de profesor elimino la lista de materias.
¿Alguien sabe que puede suceder?
Código:
/* DECLARACIÓN VARIABLES */
String SQL = null, SQLMat = null;
Statement stmt = null, stmtMat = null;
ResultSet rs = null, rsMat = null;
long id = 0;
.........
/* RECUPERAMOS LOS DATOS DE PROFESORES*/
SQL = "SELECT * FROM Profesor WHERE obsoleto_prof=false";
stmt = conex.createStatement();
rs = stmt.executeQuery(SQL);
/* AÑADIR CURSOS A LISTA PROFESORES */
while (rs.next()) {
ArrayList <Materia> listaMat = new ArrayList <Materia>();
id = rs.getLong("id_prof");
/* RECUPERAMOS LOS DATOS DE LAS MATERIAS */
modListaMat.removeAllElements();
SQLMat = "SELECT * FROM ensenha INNER JOIN Materia ON ensenha.id_mat=Materia.id_mat WHERE ensenha.id_prof="+id+""; // Recuperamos las materias asociadas al Profesor
stmtMat = conex.createStatement();
rsMat = stmtMat.executeQuery(SQLMat);
while (rsMat.next()) {
Materia mat = new Materia(rsMat.getLong("id_mat"), rsMat.getString("nombre_mat"), rsMat.getBoolean("obsoleto_mat"));
listaMat.add(mat);
}
Profesor prof = new Profesor(id, rs.getString("nombre_prof"), rs.getString("apellido_prof"), rs.getString("dni_prof"), rs.getInt("horas_prof"), rs.getString("fechaContr_prof"), rs.getBoolean("obsoleto_prof"), listaMat);
modLista.addElement(prof);
for ( int i=0 ; i<prof.getListaMaterias().size() ; i++)
System.out.println(id+"-"+prof.getListaMaterias().get(i).getNombre());
}
}
........
Si el arrayList solo lo usas en el while puedes declararlo dentro del while y asi te lo crea vacio y no tienes que borrarlo al final. Sino el problema es que tienes una referencia a un objeto que comparten todos los profesores y cuando borras una materia de uno borras en todos y cuando añades a uno lo añades a todos.
Tambien puedes tener un atributo en la clase profesor de la clase Arraylist con las materias(Este se creara vacio pero no ha null) y se lo quitas al constructor de profesor y tienes un metodo y tienes un metodo en la clase que añade y borra materias, y en el while de materias se añade al profesor y no a un Arraylist.
Tienes que hacer el new del profesor antes del while que recorre las materias.