Android Room自定义对象的类型转换器

huangapple go评论134阅读模式
英文:

Android Room Type Converter for Custom Object

问题

错误信息指出无法将自定义对象列表保存到数据库中,建议考虑添加类型转换器。您的数据类定义如下:

  1. @Entity(tableName = "calorie_daily_table")
  2. data class CalorieDaily(
  3. @PrimaryKey
  4. var date: String,
  5. var breakfast: List<Meal>
  6. )
  7. data class Meal(
  8. var foodItem: String,
  9. var foodQuantity: String,
  10. var calorie: Int
  11. )

要处理这种情况,您可以编写一个类型转换器(TypeConverter)。以下是一个示例类型转换器的代码:

  1. class Converter {
  2. var gson = Gson()
  3. @TypeConverter
  4. fun mealListToString(meals: List<Meal>): String {
  5. return gson.toJson(meals)
  6. }
  7. @TypeConverter
  8. fun stringToMealList(data: String): List<Meal> {
  9. val listType = object : TypeToken<List<Meal>>() {}.type
  10. return gson.fromJson(data, listType)
  11. }
  12. }

请确保在数据库配置中使用此类型转换器,以便Room知道如何将List<Meal>转换为字符串并存储到数据库中。这应该解决您遇到的错误。

英文:

I'm getting an error while using a list of custom object with Room.

  1. error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.

So my data class is like this:

  1. @Entity(tableName = &quot;calorie_daily_table&quot;)
  2. data class CalorieDaily(
  3. @PrimaryKey
  4. var date: String,
  5. var breakfast: List&lt;Meal&gt;)
  6. data class Meal(
  7. var foodItem: String,
  8. var foodQuantity: String,
  9. var calorie: Int)

How can i write a TypeConverter to handle this?

So, I've something like this:

  1. class Converter {
  2. var gson = Gson()
  3. @TypeConverter
  4. fun foodItemToString(foodItems: List&lt;FoodItem&gt;): String {
  5. return gson.toJson(foodItems)
  6. }
  7. @TypeConverter
  8. fun stringToFoodItem(data: String): List&lt;FoodItem&gt; {
  9. val listType = object : TypeToken&lt;List&lt;FoodItem&gt;&gt;() {
  10. }.type
  11. return gson.fromJson(data, listType)
  12. }
  13. }

But, still getting the same error.

答案1

得分: 1

你需要将注解@Embedded添加到你的第二个数据类Meal中。

英文:

You have to add the annotation @Embedded to your second data class Meal

答案2

得分: 0

尝试在早餐之前添加@TypeConverters。

  1. @TypeConverters(Converter::class)
  2. var breakfast: List<Meal>
英文:

Try adding @TypeConverters before breakfast.

  1. @TypeConverters(Converter::class)
  2. var breakfast: List&lt;Meal&gt;

答案3

得分: 0

更新的工作代码:

  1. @Entity(tableName = "calorie_daily_table")
  2. data class CalorieDaily(
  3. @PrimaryKey
  4. var date: String,
  5. @TypeConverters(Converters::class)
  6. var breakfast: List<Meal>)
  7. data class Meal(
  8. var foodItem: String,
  9. var foodQuantity: String,
  10. var calorie: Int)
  11. class Converter {
  12. var gson = Gson()
  13. @TypeConverter
  14. fun fromBreakfast(mealItems: List<Meal>): String {
  15. return gson.toJson(mealItems)
  16. }
  17. @TypeConverter
  18. fun toBreakfast(data: String): List<Meal> {
  19. val listType = object : TypeToken<List<Meal>>() {
  20. }.type
  21. return gson.fromJson(data, listType)
  22. }
  23. }
英文:

Updated working code:

  1. @Entity(tableName = &quot;calorie_daily_table&quot;)
  2. data class CalorieDaily(
  3. @PrimaryKey
  4. var date: String,
  5. @TypeConverters(Converters::class)
  6. var breakfast: List&lt;Meal&gt;)
  7. data class Meal(
  8. var foodItem: String,
  9. var foodQuantity: String,
  10. var calorie: Int)
  11. class Converter {
  12. var gson = Gson()
  13. @TypeConverter
  14. fun fromBreakfast(mealItems: List&lt;Meal&gt;): String {
  15. return gson.toJson(mealItems)
  16. }
  17. @TypeConverter
  18. fun toBreakfast(data: String): List&lt;Meal&gt; {
  19. val listType = object : TypeToken&lt;List&lt;Meal&gt;&gt;() {
  20. }.type
  21. return gson.fromJson(data, listType)
  22. }
  23. }

huangapple
  • 本文由 发表于 2020年7月29日 21:20:20
  • 转载请务必保留本文链接:https://go.coder-hub.com/63154562.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定