相关对象中带有 LIKE 子句的 GreenDao 查询

GreenDao query with LIKE clause in related object

如何使用green dao查询查询相关对象中有LIKE字符串的对象?

      QueryBuilder qb = mainDao.queryBuilder();
  qb.where(
      mainDao.Properties.Date.between(filter.getFrom().getTime(), filter.getTo().getTime()),
      qb.or(mainDao.Properties.Details.like("%"+ string + "%"),
          infoDao.Properties.Display_name.like("%" + string + "%"),
          infoDao.Properties.Email.like("%" + string + "%"),
          infoDao.Properties.Phone.like("%" + string + "%"),
          infoDao.Properties.Code.like("%" + string + "%")));

我构造的这种查询行不通?关于如何管理检查相关字段属性的查询的任何建议?

MainDao 有 InfoDao 的外键

我想我想做这样的事情:

    SELECT *
    FROM Main
    INNER JOIN Info
    ON Main.InfoID=Info.InfoID;
    WHERE Info.SomeField LIKE "%string%"

我不知道这是否是最佳解决方案,但由于 greendao 不支持 JOIN,因此它可以解决问题。此外,对于这种特殊情况,您可以简单地使用 SQLite 查询。

这里我假设您在 Main 和 Info 之间有一个关系。如果你不这样做,你可以多做几步。

List<Info> infoArray = infoDao.queyBuilder()
    .whereOr(infoDao.Properties.Display_name.like("%" + string + "%"),
        infoDao.Properties.Email.like("%" + string + "%"),
        infoDao.Properties.Phone.like("%" + string + "%"),
        infoDao.Properties.Code.like("%" + string + "%"))
    .list();

List<Main> mainArray = Collections.emptyList();
for (Info info : infoArray) {
    if(!mainArray.contains(info.getMain()) {
        mainArray.add(info.getMain());
    }
}

[更新]

如果您没有从 Info 到 Main 的关系,还有另一个版本:

List<Info> infoArray = infoDao.queryBuilder()
    .whereOr(infoDao.Properties.Display_name.like("%" + string + "%"),
        infoDao.Properties.Email.like("%" + string + "%"),
        infoDao.Properties.Phone.like("%" + string + "%"),
        infoDao.Properties.Code.like("%" + string + "%"))
    .list();

List<Long> infoIds= Collections.emptyList();
for (Info info : infoArray) {
    infoIds.add(info.getId());
}

List<Main> mainArray = mainDao.queryBuilder()
    .whereOr(mainDao.Properties.id.in(infoIds),
        mainDao.Properties.Details.like("%"+ string + "%"))
    .list();