7

私は現在 ActiveAndroid を使用しており、過去数時間、多対多の関係を機能させようとしていますが、機能させることができません。あなたが私を助けてくれることを願っています:

「学生」と「コース」というモデルがあり、学生は多くのコースを持つことができ、コースには多くの学生がいます。基本的に、これはモデル「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");
 }

今私がやろうとしているのは、次のコードで「コース X のすべての学生」を取得することです。

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

ただし、次のエラーが表示されます。

java.lang.ClassCastException: com.papinotas.models.StudentCourse は com.papinotas.models.Student にキャストできません

(Student) のキャストを (StudentCourse) に変更すると、次のエラーが発生します。

android.database.sqlite.SQLiteException: そのような列はありません: students.StudentCourse (コード 1): 、コンパイル中: SELECT * FROM students WHERE students.StudentCourse=1

私の主な目標は、うまくいけば、たった 1 つのクエリでこれを達成することです。どんな助けでも大歓迎です。前もって感謝します!

PS: 私はすでに見つけたほとんどすべてを見てきました:アクティブな Android 多対多関係https://github.com/pardom/ActiveAndroid/issues/46

4

3 に答える 3

12

私はこれには使いませんgetMany。代わりにこれを行います:

return new Select()
    .from(Student.class)
    .innerJoin(StudentCourse.class).on("students.id = studentcourses.id")
    .where("studentcourses.course = ?", courseId)
    .execute();
于 2014-10-05T23:08:46.690 に答える
2

魔法のように働きます:

クライアントクラス

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

契約クラス

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

クライアントと契約の関係

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

データベース ヘルパー

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();
    }
}
于 2016-08-29T10:16:36.890 に答える
1

(Student) のキャストを (StudentCourse) に変更すると、次のエラーが発生します...

キャストは実際には to(List<StudentCourse>)である必要がありますが、実際の問題はモデルのロジックにあります。executeSingle() を呼び出していますが、コースのすべての Student-Course 関係を取得するために、複数の StudentCourse オブジェクトが本当に必要です。1 つの StudentCourse オブジェクトには 1 つの Student と 1 つの Course しかないため、students() メソッドと course() メソッドはあまり意味がありません。

代わりに次のようにします:

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);
于 2014-10-05T22:47:22.880 に答える