2

ObjectBox を使用してデータをローカルに保存するプロジェクトがあります。

SQL でクエリを実行するとき、「Like」キーワードを使用してパターンを照合しているため、「%」を使用してすべての項目を取得できます。

ObjectBox には、クエリでこれを行う同等の方法がありますか?

4

2 に答える 2

1

これを行う公式の方法があるかどうかはまだ興味がありますが、これは私が思いついたものです。

私のクエリでは、フィルター メソッドを使用します。

private Query<InventoryItem> query = mBox
        .query()
        .greater(InventoryItem_.id, 0) //this will return all results
        .filter(new QueryFilter<InventoryItem>()
        {
            @Override
            public boolean keep(@NonNull InventoryItem entity)
            {
                if (like(entity.getDescription(), mSearchString + "%"))
                {
                    return true;
                }
                return false;
            }
        })
        .order(InventoryItem_.description)
        .build();

そして、正規表現を介して LIKE キーワードを実行する方法を次に示します。

    private static boolean like(final String str, final String expr)
{
    String safeString = (str == null) ? "" : str;
    String regex = quoteMeta(expr);
    regex = regex.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();
}

How to implement a SQL like 'LIKE' operator in Java? へのクレジット

于 2018-08-14T16:55:05.760 に答える