【问题标题】:Android + ObjectBox Search Query IssueAndroid + ObjectBox 搜索查询问题
【发布时间】:2020-10-13 07:30:18
【问题描述】:

我被 ObjectBox Like Query 卡住了。当我搜索某些东西时,我做了如下操作。

    QueryBuilder<MItemDetail> builder = mItemDetailListBox.query();
    builder.contains(MItemDetail_.productName, search);
    itemList = builder.build().find();

例如,我的数据是:

  1. 扑热息痛
  2. 扑热息痛药
  3. 扑热息痛_新

问题:

现在您知道 contains 的工作原理很简单,因为它返回包含给定搜索字符串的项目列表。

我想要什么:

  • 如果我搜索 para new,我想要结果 paracetamol_new

  • 如果我搜索 para p,我想要结果 paracetamol potest

  • 如果我搜索 para e e,我想要结果 paracetamol potestparacetamol_new

ObjectBox 中是否有任何功能或实用程序可以帮助我实现这一目标?

如果您有任何问题,请告诉我。

编辑:

评论中的给定链接,我的问题不同。我知道contains()startsWithendsWith 的所有方法,但我的问题没有得到解决。

【问题讨论】:

  • startsWith() 对您的情况有帮助吗?请用contains() 更清楚地描述您的问题。谢谢。
  • 如果我在单词之间留出空格,contains() 不会像我提到的那样给出正确的结果。我想要%yourWords%yourwords% 之类的东西(举个例子)
  • 这能回答你的问题吗? Does ObjectBox have a SQL Like keyword equivalent
  • 我不认为它对我有用,因为我不需要startWithendsWith,我也想从两者之间找到。

标签: android search android-database objectbox


【解决方案1】:

参考这个answer,我已经按照给定的方式进行了一些更改,并且得到了我想要的完美解决方案。

QueryBuilder<MItemDetail> builder = mItemDetailListBox.query();
// builder.contains(MItemDetail_.productName, search);
builder.filter(new QueryFilter<MItemDetail>() {
    @Override
    public boolean keep(@NonNull MItemDetail entity) {
        return like(entity.getProductName(), "%"+ search + "%");
    }
}).order(MItemDetail_.productName);
businessModels = builder.build().find();

在下面的方法中,我又增加了一条替换语句.replace(" ",".*?")

private static boolean like(final String str, final String expr) {
    String safeString = (str == null) ? "" : str;
    String regex = quoteMeta(expr);
    regex = regex.replace("_", ".").replace(" ",".*?").replace("%", ".*?");
    Pattern p = Pattern.compile(regex,
            Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
    return p.matcher(safeString).matches();
}

private static String quoteMeta(String s) {
    if (s == null) {
        throw new IllegalArgumentException("String cannot be null");
    }

    int len = s.length();
    if (len == 0) {
        return "";
    }

    StringBuilder sb = new StringBuilder(len * 2);
    for (int i = 0; i < len; i++) {
        char c = s.charAt(i);
        if ("[](){}.*+?$^|#\\".indexOf(c) != -1) {
            sb.append("\\");
        }
        sb.append(c);
    }
    return sb.toString();
}

谢谢。

【讨论】:

    猜你喜欢
    • 2014-04-23
    • 2021-02-06
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 2012-12-24
    • 2018-04-19
    • 1970-01-01
    相关资源
    最近更新 更多