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

时间:2015-03-09 12:49:19

标签: android mysql select greendao

如何使用绿色dao查询查询对象中有LIKE sting的对象?

      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%"

1 个答案:

答案 0 :(得分:6)

我不知道这是否是最佳解决方案,但由于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();