2016-05-24 8 views
-1

私はAndroidアプリでORMLite(v4.48)を使用しています。私は複数の "電子メール"(ForeignCollectionField)と1つの "個人"(DatabaseField)オブジェクトを含むことができるテーブル "連絡先"を持っています。データベースからContactオブジェクトを取得すると、同じContact IDを持つPersonalオブジェクトを自動的に取得(または遅延ロード)したいと思います。クエリを使用してForeign DatabaseFieldを自動的に取得する方法は?

私はすでにアクセスできる電子メールオブジェクトを自動的に取得します。しかし、何らかの理由で、Personalテーブルにエントリがあるにもかかわらず、Personalオブジェクトは常に「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を追加する必要がありますか? getEmails()と同じように、getPersonal()でデータにアクセスすると、データが遅延ロードされると思いましたか?

答えて

1

エンティティインスタンスの作成方法は表示されませんでしたが、連絡先が挿入された後にパーソナルが作成されると想定しています。その場合、個人を挿入した後、contact.setPersonal(個人)とcontactDao.update(連絡先)を行う必要があります - その方法でpersonal_idが連絡先行に保存されます

+0

私はまだそれをしていません。上記のように私のコードを変更し、個人オブジェクトをContactオブジェクトに追加します。しかし、データベースからContactオブジェクトを読み込むと、PersonalオブジェクトはNULLではなくなりましたが、私が入力したすべての値は、Personalオブジェクトの参照先Contact ID以外はNULLです。 Personalオブジェクトの直接クエリを実行すると、入力された値が表示されます。 –

+0

@DatabaseFieldにforeignAutoRefresh = trueを追加すると、そのジョブが実行されます。また、代わりにpersonalDao.refresh(personal)で外部フィールドを取得することができます –

+0

ありがとう! "foreignAutoRefresh"は欠けていた部分でした。今、私が望んでいた方法で動作します。どうもありがとう! –

関連する問題