ObjectBox 是否有一个 SQL Like 关键字等价物
Does ObjectBox have a SQL Like keyword equivalent
我有一个项目正在使用 ObjectBox 在本地存储数据。
当我在 SQL 中执行查询时,我可以使用“%”来获取所有项目,因为我使用 "Like" 关键字来匹配模式。
ObjectBox 是否有在查询中执行此操作的等效方法?
我仍然对是否有官方方法来执行此操作感兴趣,但这是我在此期间想出的方法。
在我的查询中,我使用了过滤方法。
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?
不确定您的用例的具体情况,通常使用 LIKE
来查找文本中任意位置的字符串。这由 ObjectBox 使用 contains
:
支持
List<Note> endNotes = noteBox.query().contains(Note_.text, "end").build().find();
如果你需要更强大的东西,请看这个feature request。同时,尝试结合使用 contains
(更好的性能)和 filter
(允许任何复杂性)。
PS.: 当然你可以组合多个 contains
条件,and/or 与 startsWith
和 endsWith
.
我有一个项目正在使用 ObjectBox 在本地存储数据。
当我在 SQL 中执行查询时,我可以使用“%”来获取所有项目,因为我使用 "Like" 关键字来匹配模式。
ObjectBox 是否有在查询中执行此操作的等效方法?
我仍然对是否有官方方法来执行此操作感兴趣,但这是我在此期间想出的方法。
在我的查询中,我使用了过滤方法。
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?
不确定您的用例的具体情况,通常使用 LIKE
来查找文本中任意位置的字符串。这由 ObjectBox 使用 contains
:
List<Note> endNotes = noteBox.query().contains(Note_.text, "end").build().find();
如果你需要更强大的东西,请看这个feature request。同时,尝试结合使用 contains
(更好的性能)和 filter
(允许任何复杂性)。
PS.: 当然你可以组合多个 contains
条件,and/or 与 startsWith
和 endsWith
.