1

ORMLite を使用して、Android アプリに 2 つのデータベース永続クラスがあります。

Contact:

@DatabaseTable(tableName = "contacts")
public class Contact {
    @DatabaseField(id = true, columnName = "_id")
    private int id;
    @DatabaseField
    private String first_name;
    @DatabaseField
    private String last_name;
    @ForeignCollectionField(eager = false)
    ForeignCollection<Phone> phones;
}

Phone:

@DatabaseTable(tableName = "phones")
public class Phone {
    @DatabaseField(id = true, columnName = "_id")
    private int id;
    @DatabaseField
    private String number;
    @DatabaseField(foreign = true)
    private Contact contact;
}

ご覧のとおり、aContactには多くPhoneの s があります。私がやろうとしているのは、制約を指定してクエリを生成し、その制約に一致する、、またはCharSequenceContact を見つけることです。first_namelast_namephone.number

first_nameまたはに一致する連絡先を取得するのは簡単last_nameです。

RuntimeExceptionDao<Contact, Integer> contactsDao = getHelper().getContactsDao();
QueryBuilder<Contact, Integer> contactQb = contactsDao.queryBuilder();
Where contactWhere = contactQb.where();

contactWhere.or(
    contactWhere.like("first_name", "%" + constraint + "%"),
    contactWhere.like("last_name", "%" + constraint + "%")
);

PreparedQuery<Contact> pq = contactQb.prepare();

電話番号と一致する連絡先を取得するのは簡単です。

RuntimeExceptionDao<Contact, Integer> contactsDao = getHelper().getContactsDao();
RuntimeExceptionDao<Phone, Integer> phonesDao = getHelper().getPhonesDao();
QueryBuilder<Contact, Integer> contactQb = contactsDao.queryBuilder();
QueryBuilder<Phone, Integer> phoneQb = phonesDao.queryBuilder();

phoneQb.where().like("number", "%" + constraint + "%");
PreparedQuery<Contact> pq = contactQb.join(phoneQb).prepare();

しかし、2 つを結合しようとすると、最後のカーソルで 2 つのデータ セットの交差が得られるようです (ご想像のとおり、通常は 0 の結果です)。代わりにデータセットの結合を取得する方法はありますか?

ORMLite がRIGHT JOINスタイル クエリをサポートしていないこと、または結合テーブルから結果にデータを返すことをサポートしていないことは承知していますが、それは私が望んでいることではありません。必要なのはContacts.

また、私が a を使用していることにも注意してください。そのCursorAdapterため、(私が知る限り)単純に 2 つの要求を作成して、結果の配列を結合することはできません。データは に表示される予定ListViewです。

contactsテーブル

|   id   |  first_name  |  last_name  |
---------------------------------------
|   10   |  Matthew     |  Smith      |
---------------------------------------
|   21   |  John        |  Smith      |
---------------------------------------

phonesテーブル

|   id   |  number      | contact_id  |
---------------------------------------
|   99   |  0444444444  |     10      |
---------------------------------------
|  123   |  0444666666  |     21      |
---------------------------------------

「Smith」を検索すると、両方の連絡先が返されます。「4444」を検索すると Matthew Smith のみが返され、「0666」を検索すると John Smith のみが返され、「044」を検索すると両方の連絡先が返されます。

編集-ソリューションが一意の結果のみを返す場合のボーナスポイント-私が現在行っている方法のもう1つの副作用は、各結果がListView複数回表示されることです-名前に対して1回、それぞれに対して1回Phone

4

1 に答える 1