ActiveAndroid Many-to-many relationship

前端 未结 3 1499
忘掉有多难
忘掉有多难 2021-01-05 06:33

I’m currently using ActiveAndroid, and have been trying to get a many-to-many relationship to work for the past few hours, however I just can’t get it to work. I hope you ca

相关标签:
3条回答
  • 2021-01-05 06:55

    If I change the cast of (Student) to (StudentCourse) I get the following error...

    The cast should actually be to (List<StudentCourse>), but the real problem is in the logic of your model here. You are calling executeSingle(), but you really want multiple StudentCourse objects so that you get every Student-Course relationship for the Course. Your students() and courses() methods don't make much sense, since one StudentCourse object only has one Student and one Course.

    I would do it like so instead:

    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);
    
    0 讨论(0)
  • 2021-01-05 07:05

    I wouldn't use getMany for this. I'd do this instead:

    return new Select()
        .from(Student.class)
        .innerJoin(StudentCourse.class).on("students.id = studentcourses.id")
        .where("studentcourses.course = ?", courseId)
        .execute();
    
    0 讨论(0)
  • 2021-01-05 07:06

    Work like a charm:

    Client class

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

    Contract class

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

    Relation between Client and Contract

     @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;
    }
    

    Database helper

    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();
        }
    }
    
    0 讨论(0)
提交回复
热议问题