我使用 ORMLite 在我的 Android 应用程序中有两个数据库持久类 -
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
任何联系人。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();
但是当我尝试将两者结合起来时,它似乎给了我最终游标中两个数据集的交集(正如您可以想象的那样,通常是 0 结果)。有没有办法获得数据集的联合?
我知道 ORMLite 不支持RIGHT JOIN
样式查询或将数据从连接表返回到结果中,但这不是我想要的 - 我需要的只是Contacts
.
另请注意,我使用的是CursorAdapter
,所以(据我所知)我不能简单地发出两个请求,然后将生成的数组连接在一起。数据注定要显示在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”将返回两个联系人。
编辑- 如果解决方案仅返回唯一结果,则奖励积分 - 我目前这样做的方式的另一个副作用是每个结果都显示ListView
多次 - 一次显示其名称,然后再次显示它的名称Phone
。