如何通过查询自动获取外部DatabaseField?
How to get foreign DatabaseField automatically with query?
我在 Android 应用中使用 ORMLite (v4.48)。我有 table "Contact" 可以包含多个 "Email" (ForeignCollectionField) 和一个 "Personal" (DatabaseField) 对象。当我从数据库中获取联系人对象时,我想自动获取(或延迟加载)具有相同联系人 ID 的个人对象。
它已经自动获取我可以访问的电子邮件对象。但是出于某种原因,即使个人 table.
中有一个条目,个人对象始终是 "null"
这是我的 类:
@DatabaseTable(tableName = "Contact", daoClass = ContactDao.class)
public class Contact {
@DatabaseField(generatedId = true, columnName = PersistentObject.ID)
int id;
@DatabaseField(index = true)
String contactName;
@ForeignCollectionField(eager = false)
ForeignCollection<Email> emails;
@DatabaseField(foreign = true)
public Personal personal;
public ForeignCollection<Email> getEmails() {
return emails;
}
public void setEmails(ForeignCollection<Email> emails) {
this.emails = emails;
}
public Personal getPersonal() {
return personal;
}
public void setPersonal(Personal personal) {
this.personal = personal;
}
...
}
和
@DatabaseTable(tableName = "Email", daoClass = EmailDao.class)
public class Email {
@DatabaseField(generatedId = true, columnName = PersistentObject.ID)
int id;
@DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = PersistentObject.CONTACT_ID_FIELD_NAME) // contact_id
Contact contact;
@DatabaseField
String emailType;
@DatabaseField(canBeNull = false)
String email;
public Email() {
}
public Email(int id, Contact Contact, String emailType, String email) {
this.id = id;
this.contact = contact;
this.emailType = emailType;
this.email = email;
}
public int getId() {
return id;
}
public Contact getContact() {
return contact;
}
public void setContact(Contact contact) {
this.contact = contact;
}
public String getEmailType() {
return emailType;
}
public void setEmailType(String emailType) {
this.emailType = emailType;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
...
}
和
@DatabaseTable(tableName = "Personal", daoClass = PersonalDao.class)
public class Personal {
@DatabaseField(generatedId = true, columnName = PersistentObject.ID)
int id;
@DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = PersistentObject.CONTACT_ID_FIELD_NAME)
Contact contact;
@DatabaseField
int age;
@DatabaseField
int weight; // in grams
@DatabaseField
int height; // in cm
public Personal() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Contact getContact() {
return contact;
}
public void setContact(Contact contact) {
this.contact = contact;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}
我是这样从数据库中获取数据的:
QueryBuilder<Contact, Integer> queryBuilder = mContactDao.queryBuilder();
queryBuilder.orderBy("lastViewed", false);
queryBuilder.limit(limit);
PreparedQuery<Contact> preparedQuery = queryBuilder.prepare();
List<Contact> contactList = mContactDao.query(preparedQuery);
到目前为止一切正常。
然后进一步深入代码,我可以像这样访问电子邮件对象:
ForeignCollection<Email> emails = contact.getEmails();
Iterator<Email> iter = emails.iterator();
while (iter.hasNext()) {
Email iAddress = iter.next();
Log.d(TAG, "EMAIL: " + iAddress.getEmail());
Log.d(TAG, "EMAIL TYPE: " + iAddress.getEmailType());
}
这也很完美。只有当我想访问 Personal 对象时,我总是得到 NULL。
Personal personal = contact.getPersonal(); // is always NULL
我不明白这是为什么。我是否需要在查询构建器中手动添加 JOIN?我认为一旦我使用 getPersonal() 访问它,它也会延迟加载数据,就像使用 getEmails()?
您没有说明实体实例是如何创建的,但我假设个人是在插入联系人后创建的。如果是这种情况,那么在插入个人后你应该做 contact.setPersonal(personal),和 contactDao.update(contact) - 这样 personal_id 将存储在联系人行
我在 Android 应用中使用 ORMLite (v4.48)。我有 table "Contact" 可以包含多个 "Email" (ForeignCollectionField) 和一个 "Personal" (DatabaseField) 对象。当我从数据库中获取联系人对象时,我想自动获取(或延迟加载)具有相同联系人 ID 的个人对象。
它已经自动获取我可以访问的电子邮件对象。但是出于某种原因,即使个人 table.
中有一个条目,个人对象始终是 "null"这是我的 类:
@DatabaseTable(tableName = "Contact", daoClass = ContactDao.class)
public class Contact {
@DatabaseField(generatedId = true, columnName = PersistentObject.ID)
int id;
@DatabaseField(index = true)
String contactName;
@ForeignCollectionField(eager = false)
ForeignCollection<Email> emails;
@DatabaseField(foreign = true)
public Personal personal;
public ForeignCollection<Email> getEmails() {
return emails;
}
public void setEmails(ForeignCollection<Email> emails) {
this.emails = emails;
}
public Personal getPersonal() {
return personal;
}
public void setPersonal(Personal personal) {
this.personal = personal;
}
...
}
和
@DatabaseTable(tableName = "Email", daoClass = EmailDao.class)
public class Email {
@DatabaseField(generatedId = true, columnName = PersistentObject.ID)
int id;
@DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = PersistentObject.CONTACT_ID_FIELD_NAME) // contact_id
Contact contact;
@DatabaseField
String emailType;
@DatabaseField(canBeNull = false)
String email;
public Email() {
}
public Email(int id, Contact Contact, String emailType, String email) {
this.id = id;
this.contact = contact;
this.emailType = emailType;
this.email = email;
}
public int getId() {
return id;
}
public Contact getContact() {
return contact;
}
public void setContact(Contact contact) {
this.contact = contact;
}
public String getEmailType() {
return emailType;
}
public void setEmailType(String emailType) {
this.emailType = emailType;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
...
}
和
@DatabaseTable(tableName = "Personal", daoClass = PersonalDao.class)
public class Personal {
@DatabaseField(generatedId = true, columnName = PersistentObject.ID)
int id;
@DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = PersistentObject.CONTACT_ID_FIELD_NAME)
Contact contact;
@DatabaseField
int age;
@DatabaseField
int weight; // in grams
@DatabaseField
int height; // in cm
public Personal() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Contact getContact() {
return contact;
}
public void setContact(Contact contact) {
this.contact = contact;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}
我是这样从数据库中获取数据的:
QueryBuilder<Contact, Integer> queryBuilder = mContactDao.queryBuilder();
queryBuilder.orderBy("lastViewed", false);
queryBuilder.limit(limit);
PreparedQuery<Contact> preparedQuery = queryBuilder.prepare();
List<Contact> contactList = mContactDao.query(preparedQuery);
到目前为止一切正常。 然后进一步深入代码,我可以像这样访问电子邮件对象:
ForeignCollection<Email> emails = contact.getEmails();
Iterator<Email> iter = emails.iterator();
while (iter.hasNext()) {
Email iAddress = iter.next();
Log.d(TAG, "EMAIL: " + iAddress.getEmail());
Log.d(TAG, "EMAIL TYPE: " + iAddress.getEmailType());
}
这也很完美。只有当我想访问 Personal 对象时,我总是得到 NULL。
Personal personal = contact.getPersonal(); // is always NULL
我不明白这是为什么。我是否需要在查询构建器中手动添加 JOIN?我认为一旦我使用 getPersonal() 访问它,它也会延迟加载数据,就像使用 getEmails()?
您没有说明实体实例是如何创建的,但我假设个人是在插入联系人后创建的。如果是这种情况,那么在插入个人后你应该做 contact.setPersonal(personal),和 contactDao.update(contact) - 这样 personal_id 将存储在联系人行