在 Room 的 where 子句中使用 List

Using List in where clause in Room

我正在使用 Room for DB,并且有一个名为 'Products' 的 table。 产品实体 class 具有字段 ArrayList'String' 标签。

@Entity Class Products { some auto generate primary key; String name; ArrayList<String>tags;}

我想按标签搜索产品,怎么办? 我们可以在 where 子句中使用 'tags' 吗?我在下面尝试但没有成功:

select name from Products where tags IN (:value) List<String> getSearchedProducts(String value);

使用此类型转换器保存列表。

public class StringListConverters {

private static Gson gson = new Gson();

@TypeConverter
public static ArrayList<String> fromString(String data) {
    Type listType = new TypeToken<ArrayList<String>>() {}.getType();
    return gson.fromJson(data, listType);
}

@TypeConverter
public static String fromArrayList(ArrayList<String> list) {
    return gson.toJson(list);
}

}

按名称搜索有效,但按标签搜索无效。 除了语法、错误修复等之外,我正在寻找在 Room DB 中搜索集合的方法。

您尝试实现的目标有效,我遇到了 问题。在我的例子中,我有一个 String[],如果你提供一个用逗号分隔的 String,它就不起作用,但它也应该与 ArrayList 一起工作。

如果您不经常操作 tags 列表并且在创建后不向其添加元素,则使用 String[]。这样你就不必使用 TypeConverter.

我得到了答案,很简单。 这就是我们搜索存储在列中的 ArrayList 的方式。

select name from Products where tags Like :value List<String> getSearchedProducts(String value);

这也是有道理的,因为 Room 将列表转换为字符串条目并保存在列中,根据我在搜索 ArrayList 时的假设,它将像 foreach 循环一样在该列中循环。

要按名称或标签搜索,您可以这样做:

select name from Products where name Like :value OR tags Like :value List<String> getSearchedProducts(String value);