gpt4 book ai didi

android - ORMLite - 从两个表中查找结果的并集

转载 作者:行者123 更新时间:2023-11-30 03:24:25 26 4
gpt4 key购买 nike

我的 Android 应用程序中有两个使用 ORMLite 的数据库持久类 -

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;
}

如您所见,Contact有很多Phone秒。我想做的是生成一个查询,给定 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它有。

最佳答案

But when I try to combine the two, it seems to give me the intersect of the two data sets in the final cursor (which, as you can imagine, is usually 0 results). Is there some way to get the union of the data sets instead?

如果我理解 Matt,您要做的是对名称和数字使用相同的 constraint 并显示匹配的结果——因此使用“union”一词。我想有一个 nameConstraint 然后一个 numberConstraint 不是一个选项。

看起来这里缺少一个功能。默认情况下 ORMLite正在组合来自查询构建器和连接的查询构建器的 WHERE 语句,它目前使用 AND。我刚刚将 QueryBuilder.joinOr(...)innerJoinOr(...) 添加到 ORMLite 主干,它将在 4.47 版中使用 OR

在此版本发布之前,您将不得不使用 dao.queryRaw(...) 方法并将其作为原始查询执行。

关于android - ORMLite - 从两个表中查找结果的并集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18504474/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com