[英]What should we do for nested objects in Room?
如果有像我下面的 JSON 结构这样的结构,我们应该如何创建实体类? 没有这方面的例子。 虽然很早以前写的文章中使用@embeded 用于内部arrays,但现在使用类似于转换器的结构。 我们应该使用哪一个? 这些有什么作用? 如何创建我的类型的结构? 请帮助 Java
所有需要的结构都可以在这里找到: https://github.com/theoyuncu8/roomdb
JSON 数据
{
"MyData": [
{
"food_id": "1",
"food_name": "Food 1",
"food_image": "imageurl",
"food_kcal": "32",
"food_url": "url",
"food_description": "desc",
"carb_percent": "72",
"protein_percent": "23",
"fat_percent": "4",
"units": [
{
"unit": "Unit A",
"amount": "735.00",
"calory": "75.757",
"calcium": "8.580",
"carbohydrt": "63.363",
"cholestrl": "63.0",
"fiber_td": "56.12",
"iron": "13.0474",
"lipid_tot": "13.01",
"potassium": "11.852",
"protein": "717.1925",
"sodium": "112.02",
"vit_a_iu": "110.7692",
"vit_c": "110.744"
},
{
"unit": "Unit C",
"amount": "32.00",
"calory": "23.757",
"calcium": "53.580",
"carbohydrt": "39.363",
"cholestrl": "39.0",
"fiber_td": "93.12",
"iron": "93.0474",
"lipid_tot": "93.01",
"potassium": "9.852",
"protein": "72.1925",
"sodium": "10.0882",
"vit_a_iu": "80.7692",
"vit_c": "80.744"
}
]
},
{
"food_id": "2",
"food_name": "Food 2",
"food_image": "imageurl",
"food_kcal": "50",
"food_url": "url",
"food_description": "desc",
"carb_percent": "25",
"protein_percent": "14",
"fat_percent": "8",
"units": [
{
"unit": "Unit A",
"amount": "25.00",
"calory": "25.757",
"calcium": "55.580",
"carbohydrt": "53.363",
"cholestrl": "53.0",
"fiber_td": "53.12",
"iron": "53.0474",
"lipid_tot": "53.01",
"potassium": "17.852",
"protein": "757.1925",
"sodium": "122.02",
"vit_a_iu": "10.7692",
"vit_c": "10.744"
},
{
"unit": "Unit C",
"amount": "2.00",
"calory": "2.757",
"calcium": "5.580",
"carbohydrt": "3.363",
"cholestrl": "3.0",
"fiber_td": "3.12",
"iron": "3.0474",
"lipid_tot": "3.01",
"potassium": "77.852",
"protein": "77.1925",
"sodium": "12.02",
"vit_a_iu": "0.7692",
"vit_c": "0.744"
},
{
"unit": "Unit G",
"amount": "1.00",
"calory": "2.1",
"calcium": "0.580",
"carbohydrt": "0.363",
"cholestrl": "0.0",
"fiber_td": "0.12",
"iron": "0.0474",
"lipid_tot": "0.01",
"potassium": "5.852",
"protein": "0.1925",
"sodium": "1.02",
"vit_a_iu": "0.7692",
"vit_c": "0.744"
}
]
}
]
}
实体 Class
食品 Class
public class Foods {
@SerializedName("food_id")
@Expose
private String foodId;
@SerializedName("food_name")
@Expose
private String foodName;
@SerializedName("food_image")
@Expose
private String foodImage;
@SerializedName("food_kcal")
@Expose
private String foodKcal;
@SerializedName("food_url")
@Expose
private String foodUrl;
@SerializedName("food_description")
@Expose
private String foodDescription;
@SerializedName("carb_percent")
@Expose
private String carbPercent;
@SerializedName("protein_percent")
@Expose
private String proteinPercent;
@SerializedName("fat_percent")
@Expose
private String fatPercent;
// here
@SerializedName("units")
@Expose
private List<FoodUnitsData> units = null;
// getter setter
}
FoodUnitsData Class
public class FoodUnitsData {
@SerializedName("unit")
@Expose
private String unit;
@SerializedName("amount")
@Expose
private String amount;
@SerializedName("calory")
@Expose
private String calory;
@SerializedName("calcium")
@Expose
private String calcium;
@SerializedName("carbohydrt")
@Expose
private String carbohydrt;
@SerializedName("cholestrl")
@Expose
private String cholestrl;
@SerializedName("fiber_td")
@Expose
private String fiberTd;
@SerializedName("iron")
@Expose
private String iron;
@SerializedName("lipid_tot")
@Expose
private String lipidTot;
@SerializedName("potassium")
@Expose
private String potassium;
@SerializedName("protein")
@Expose
private String protein;
@SerializedName("sodium")
@Expose
private String sodium;
@SerializedName("vit_a_iu")
@Expose
private String vitAIu;
@SerializedName("vit_c")
@Expose
private String vitC;
// getter setter
}
将它们分成 2 个实体,而不是创建关系 class。 这个关系 class 使用 FoodListModel 作为嵌入属性,它与作为 List 的 UnitList 有关系。
这些有什么作用?
TypeConverters用于将 room 无法处理的类型转换为它可以处理的类型(String、primitives、integer 类型如 Integer、Long、十进制类型如 Double、Float)。
@Embedded基本上说包括@Embedded class 的成员变量作为列。 例如@Embedded FoodUnitsData foodUnitsData;
.
我们应该使用哪一个?
您的主要问题是FoodUnitsData列表
尽管您可以转换 List 并使用 TypeConverter,但我不建议这样做。
您可能会转换为 JSON 字符串(因此您从 JSON 提取到对象,然后将嵌入的对象存储为 JSON) 。 您使数据膨胀,也使使用该数据变得困难。
例如,假设您想搜索含有 1000 卡路里或更多卡路里的食物,这将需要一个非常复杂的查询,或者您将加载所有数据库,然后循环遍历食物和单位。
我会说@Embedded
是使用的方法。 随着使用@Ignore
(相反,即排除成员变量作为列)。 即你会@Ignore Foods class 中的列表。
使用@Embedded
,您可以轻松地在查询中使用单个值。
然后,您可以执行类似SELECT * FROM the_table_used_for_the_foodunitsdata WHERE calory > 1000
之类的操作,您将获得返回的 FoodUnitsData 列表。 SQLite 将非常有效地做到这一点。
工作示例
因此,将上述内容放入一个工作示例中:-
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.