ActiveAndroid Relación de muchos a muchos

Actualmente estoy usando ActiveAndroid, y he estado tratando de conseguir una relación muchos-a-muchos para trabajar durante las últimas horas, sin embargo, simplemente no puedo conseguir que funcione. Espero que me puedas ayudar:

Tengo los modelos "Estudiante" y "Curso", un estudiante puede tener muchos cursos, y un curso tiene muchos estudiantes. Básicamente esto es lo que tengo en el modelo "StudentCourse":

@Column(name = COURSE) public Course course; @Column(name = STUDENT) public Student student; public StudentCourse(Student student, Course course) { super(); this.student = student; this.course = course; } // public StudentCourse(){ } public List<Course> courses(){ return getMany(Course.class, "StudentCourse"); } public List<Student> students(){ return getMany(Student.class, "StudentCourse"); } 

En este momento lo que estoy tratando de hacer es obtener "todos los estudiantes en el curso X", con el siguiente código:

 ((Student) new Select().from(StudentCourse.class).where("course = ?",selectedCourse.getId()).executeSingle()).students(); 

Sin embargo, obtengo el siguiente error:

Java.lang.ClassCastException: com.papinotas.models.StudentCourse no se puede convertir en com.papinotas.models.Student

Si cambio el elenco de (Estudiante) a (CursulaEstudiante) obtengo el siguiente error:

Android.database.sqlite.SQLiteException: no hay tal columna: students.StudentCourse (código 1):, mientras compila: SELECT * FROM students WHERE students.StudentCourse = 1

Mi objetivo principal es lograr esto con una sola consulta. Cualquier ayuda sería muy apreciada. ¡Gracias por adelantado!

PS: Ya he mirado casi todo lo que pude encontrar: Active Android relación muchos-a-muchos y https://github.com/pardom/ActiveAndroid/issues/46

No usaría getMany para esto. Lo haría en su lugar:

 return new Select() .from(Student.class) .innerJoin(StudentCourse.class).on("students.id = studentcourses.id") .where("studentcourses.course = ?", courseId) .execute(); 

Si cambio el elenco de (Estudiante) a (Cursula Estudiantil) obtengo el siguiente error …

El elenco debe ser realmente a (List<StudentCourse>) , pero el verdadero problema está en la lógica de su modelo aquí. Usted está llamando a executeSingle (), pero realmente quiere varios objetos de StudentCourse para que obtenga todas las relaciones de Estudiante-Curso para el Curso. Sus métodos students () y courses () no tienen mucho sentido, ya que un objeto StudentCourse sólo tiene un estudiante y un curso.

Lo haría así:

 List<StudentCourse> enrolments = new Select().from(StudentCourse.class).where("course = ?",selectedCourse.getId()).execute(); List<Student> studentsInCourse = new ArrayList<Student>(); for(StudentCourse enrolment:enrolments) studentsInCourse.add(enrolment.student); 

Trabaja como un encanto:

Clase de cliente

  @Table(name = "Client") public class Client extends Model{} 

Clase de contrato

  @Table(name = "Contract") public class Contract extends Model{} 

Relación entre Cliente y Contrato

  @Table(name = "ClientContract") public class ClientContract extends Model { @Column(name = "Client", onDelete = Column.ForeignKeyAction.CASCADE) public Client client; @Column(name = "Contract", onDelete = Column.ForeignKeyAction.CASCADE) public Contract contract; } 

Ayudante de base de datos

 public class DBHelper { public List<Contract> getRelatedContracts(Client client) { List<Contract> contracts = null; if (client != null && client.isCreated()) { contracts = new Select() .from(Contract.class) .innerJoin(ClientContract.class).on("ClientContract.Contract = Contract.id") .where("ClientContract.Client = ?", client.getId()) .execute(); } return contracts; } public List<Client> getRelatedClients(Contract contract) { List<Client> clients = null; if (contract != null && contract.isCreated()) { clients = new Select() .from(Client.class) .innerJoin(ClientContract.class).on("ClientContract.Client = Client.id") .where("ClientContract.Contract = ?", contract.getId()) .execute(); } return clients; } // get relation public ClientContract getClientContract(Client client, Contract contract) { ClientContract clientContract = null; if (client != null && contract != null && client.isCreated() && contract.isCreated()) { clientContract = new Select().from(ClientContract.class) .where("Client = ?", client.getId()) .where("Contract = ?", contract.getId()) .executeSingle(); } return clientContract; } // add relation public ClientContract addClientContract(Client client, Contract contract) { ClientContract clientContract = getClientContract(client, contract); if (client != null && contract != null && clientContract == null) { if (client.getId() == null) client.save(); if (contract.getId() == null) contract.save(); clientContract = new ClientContract(); clientContract.client = client; clientContract.contract = contract; clientContract.save(); } return clientContract; } // delete relation public void deleteClientContract(Client client, Contract contract) { ClientContract clientContract = getClientContract(client, contract); if (clientContract != null && contract.isCreated()) clientContract.delete(); } } 
  • Operador '! =' No se puede aplicar a los operandos de tipo 'Tarea' e 'int'
  • ¿Podemos usar Guid como clave principal en la base de datos de SQL Server?
  • Los datos guardados se perdieron al reiniciar la aplicación (android)
  • Mantener los datos SQLite después de la actualización
  • Cierre de la base de datos en un ContentProvider
  • Mueva el cursor a la fila por una de las columnas
  • SQLite es sin tipo?
  • ¿Cuán cuidado debo tener con el hilo de seguridad al crear métodos / actividades que interactúan con la base de datos SQLite?
  • Android - Contenido Valores sobre la escritura de filas existentes
  • Android: Actualización de bases de datos locales desde una base de datos en línea
  • Eliminar la base de datos sqlite al actualizar la nueva versión de la aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.