2016-05-24 2 views
-1

Я использую ORMLite (v4.48) с моим Android-приложением. У меня есть таблица «Контакт», которая может содержать несколько «Email» (ForeignCollectionField) и один «Личный» (DatabaseField). Когда я получаю объект Contact из базы данных, я хотел бы автоматически получить (или ленивую загрузку) персональный объект с таким же идентификатором контакта.Как получить внешний DatabaseField автоматически с запросом?

Он уже автоматически получает объекты электронной почты, к которым я могу получить доступ. Но почему-то персональный объект всегда «нуль», хотя в таблице «Персональный» есть запись.

Вот мои классы:

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

Который также работает отлично. Только если я хочу получить доступ к персональному объекту, я всегда получаю NULL.

Personal personal = contact.getPersonal(); // is always NULL 

Я не могу понять, почему это так. Нужно ли вручную добавлять JOIN в построитель запросов? Я думал, что это будет также лениво загружать данные, как только я получаю доступ к getPersonal(), как это делает с getEmails()?

ответ

1

Вы не указали, как создаются экземпляры сущности, но я предполагаю, что Personal создан после того, как был вставлен контакт. Если это так, то после вставки Personal вы должны сделать contact.setPersonal (личный) и contactDao.update (контакт) - таким образом personal_id будет сохранен в строке контактов

+0

Я еще не сделал этого. Изменен мой код, как вы упомянули, и добавляет объект Personal к объекту Contact. Но когда я прочитал объект Contact из базы данных, личный объект больше не был NULL, но все введенные значения были NULL, за исключением ссылки Contact ID в персональном объекте. Однако, когда я делаю прямой запрос для Личного объекта, я могу видеть введенные значения. –

+0

добавление foreignAutoRefresh = true в @DatabaseField должно выполнять задание. Кроме того, вместо этого вы можете получить чуждое поле с personalDao.refresh (личным) –

+0

Спасибо! «foreignAutoRefresh» - недостающая часть. Теперь он работает так, как я хотел. Большое спасибо! –

Смежные вопросы