【问题标题】:Android Room - How to return a List of Set for an entityAndroid Room - 如何返回实体的集合列表
【发布时间】:2018-09-27 23:56:39
【问题描述】:

我有以下 Room 查询,我想在其中获取一组字符串。

@Query("SELECT books FROM students")
List<Set<String>> getAllBooks();

这是一个学生类示例。

@Data // Lombok
@Entity(tableName = "students"
public class Student {
    @NonNull
    @PrimaryKey
    private String studentId;

    @TypeConverter(SetToStringConverter.class)
    private Set<String> books;
}

编译这个给我Not sure how to convert a Cursor to this method's return type

考虑我将每个学生的书籍保存在一个 Set 中,并有一个 TypeConverter 用于将其存储到数据库中。 SetToStringConverter 使用 ObjectMapper 将字符串的哈希集转换为字符串,反之亦然。

如何检索所有学生的所有书籍?

【问题讨论】:

    标签: java dao android-room android-architecture-components


    【解决方案1】:

    你的转换器应该实现一个函数来将房间查询的“'String'输出转换为'SetofStrings'”,否则它将无法工作。

    import android.arch.persistence.room.TypeConverter;
    
    import com.google.gson.Gson;
    import com.google.gson.reflect.TypeToken;
    
    import java.lang.reflect.Type;
    import java.util.HashSet;
    
    public class StringsHashSetConverter {
    
        @TypeConverter
        public static HashSet<String> toStringsHashSet(String value) {
            Type listType = new TypeToken<HashSet<String>>() {}.getType();
            return new Gson().fromJson(value, listType);
        }
    
        @TypeConverter
        public static String toString(HashSet<String> list) {
            Gson gson = new Gson();
            return gson.toJson(list);
        }
    }
    

    此外,您需要根据您的要求使用 Set 接口的实现(例如 'HashSet' )字段的数据类型以避免任何错误。

    @TypeConverter(StringsHashSetConverter.class)
    private HashSet<String> books;
    

    【讨论】:

    • 是的,我的转换器和你提到的一样。但是房间仍然不喜欢 List> 作为返回类型。
    • 您需要使用准确的 Set 实现,即 HashSet。 Room 无法识别接口,即设置。而不是 List> 尝试使用 ArrayList>.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 2014-09-17
    • 2018-11-05
    相关资源
    最近更新 更多