1

我使用 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有许多Phones。我要做的是在给定约束的情况下生成一个查询,以查找其、或与约束匹配的CharSequence任何联系人。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();

但是当我尝试将两者结合起来时,它似乎给了我最终游标中两个数据集的交集(正如您可以想象的那样,通常是 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

4

1 回答 1

1

但是当我尝试将两者结合起来时,它似乎给了我最终游标中两个数据集的交集(正如您可以想象的那样,通常是 0 结果)。有没有办法获得数据集的联合?

如果我理解马特,那么您要做的就是constraint对名称和数字使用相同的内容,并显示匹配的结果——因此是“联合”一词。我想先 anameConstraint然后 anumberConstraint不是一种选择。

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

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

于 2013-09-05T16:56:18.810 回答