Android Room Database:如何处理实体中的 Arraylist?

新手上路,请多包涵

我刚刚实现了 Room 用于离线数据保存。但是在实体类中,我收到以下错误:

 Error:(27, 30) error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.

课程如下:

 @Entity(tableName = "firstPageData")
public class MainActivityData {

    @PrimaryKey
    private String userId;

    @ColumnInfo(name = "item1_id")
    private String itemOneId;

    @ColumnInfo(name = "item2_id")
    private String itemTwoId;

    // THIS IS CAUSING THE ERROR... BASICALLY IT ISN'T READING ARRAYS
    @ColumnInfo(name = "mylist_array")
    private ArrayList<MyListItems> myListItems;

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public ArrayList<MyListItems> getMyListItems() {
        return myListItems;
    }

    public void setCheckListItems(ArrayList<MyListItems> myListItems) {
        this.myListItems = myListItems;
    }

}

所以基本上我想将 ArrayList 保存在数据库中,但我找不到任何相关的东西。你能指导我如何使用 Room 保存阵列吗?

注意:MyListItems Pojo 类包含 2 个字符串(截至目前)

提前致谢。

原文由 Tushar Gogna 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

选项 #1: MyListItems 成为 @Entity ,就像 MainActivityData 一样。 MyListItems 将设置一个 @ForeignKey 返回到 MainActivityData 。但是,在这种情况下, MainActivityData 不能有 private ArrayList<MyListItems> myListItems ,就像在 Room 中一样,实体不引用其他实体。但是,视图模型或类似的 POJO 构造可能具有 MainActivityData 及其关联的 ArrayList<MyListItems>

选项 #2:设置一对 @TypeConverter 方法将 ArrayList<MyListItems> 转换为一些基本类型(例如,一个 String ,例如使用 JSON一种存储格式)。现在, MainActivityData 可以直接拥有它的 ArrayList<MyListItems> 。但是, MyListItems 不会有单独的表,因此您不能很好地查询 MyListItems

原文由 CommonsWare 发布,翻译遵循 CC BY-SA 3.0 许可协议

类型转换器 是专门为此制作的。在您的情况下,您可以使用下面给出的代码片段将数据存储在数据库中。

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

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

并像这样在您的 Room DB 中提及此类

@Database (entities = {MainActivityData.class},version = 1)
@TypeConverters({Converters.class})

更多信息 在这里

原文由 Amit Bhandari 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏