[英]ActiveAndroid Many-to-many relationship
我目前正在使用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
如果我將(學生)的演員表更改為(StudentCourse),我會收到以下錯誤:
android.database.sqlite.SQLiteException:沒有這樣的專欄:students.StudentCourse(代碼1):,同時編譯:SELECT * FROM學生WHERE students.StudentCourse = 1
我的主要目標是希望在一個查詢中實現這一點。 任何幫助將不勝感激。 提前致謝!
PS:我已經看過幾乎所有我能找到的東西: 活躍的Android多對多關系和https://github.com/pardom/ActiveAndroid/issues/46
我不會為此使用getMany
。 我會這樣做:
return new Select()
.from(Student.class)
.innerJoin(StudentCourse.class).on("students.id = studentcourses.id")
.where("studentcourses.course = ?", courseId)
.execute();
像魅力一樣工作:
客戶類
@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();
}
}
如果我將(學生)的演員改為(學生課程),我會收到以下錯誤...
演員應該實際上是(List<StudentCourse>)
,但真正的問題在於你的模型的邏輯。 您正在調用executeSingle(),但您確實需要多個StudentCourse對象,以便您獲得課程的每個學生 - 課程關系。 您的students()和courses()方法沒有多大意義,因為一個StudentCourse對象只有一個學生和一個課程。
相反,我會這樣做:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.