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 があります。私がやろうとしているのは、制約を指定してクエリを生成し、その制約に一致する、、またはCharSequence
Contact を見つけることです。first_name
last_name
phone.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
。