使用 POJO 在 GreenDao 中自定义类型 class
Custom type in GreenDao with POJO class
这是我的样本JSON:
{
"open":true,
"total_products":100,
"product":[
{
"p_id":1,
"price":"5.00",
"name":"blah one"
},
{
"p_id":2,
"price":"15.00",
"name":"blah two"
},
...
]
}
这是我的 POJO class:
@Entity(nameInDb = "products")
public class ProductsPOJO {
@SerializedName("open")
@Property(nameInDb = "open")
private boolean open;
@SerializedName("total_products")
@Property(nameInDb = "total_products")
private Long total_products;
@Convert(converter = ProductConverter.class, columnType = String.class)
@SerializedName("product")
@Property(nameInDb = "product")
private Product product;
public static class productConverter implements PropertyConverter<Product, String> {
//What shoudl I write in convert part?!
@Override
public Product convertToEntityProperty(String databaseValue) {
if (databaseValue == null) {
return null;
}
for (Product p : Product.values()) {
if (p.id == databaseValue) {
return p;
}
}
return Product.DEFAULT;
}
@Override
public String convertToDatabaseValue(Product entityProperty) {
return entityProperty == null ? null : entityProperty.;
}
//
/*@Override
public Product convertToEntityProperty(String databaseValue) {
return Product.valueOf(databaseValue);
}
@Override
public String convertToDatabaseValue(Product entityProperty) {
return entityProperty.name();
}*/
}
public static class Product{
@Id
@SerializedName("p_id")
private Long p_id;
@SerializedName("price")
@Property(nameInDb = "price")
private String price;
@SerializedName("name")
@Property(nameInDb = "name")
private String name;
//Getters & Setters
}
public Product getProduct() {
return product;
}
public void setProduct(Product data) {
this.product = product;
}
//open & total_products Getters & Setters
}
但是我不知道productConverter
应该写什么。
另一方面,Product
class 中的字段有多种类型。 String
和 Integer
.
我读了这些:
https://github.com/greenrobot/greenDAO/blob/V3.1.1/examples/DaoExample/src/main/java/org/greenrobot/greendao/example/Note.java#L26-L27
编辑: :/我在这里也混淆了两件事,greenrobot objectbox 和 greendao ...抱歉,但答案保持不变,只需将 objectbox 替换为 greendao :)
在我看来,你在这里混淆了 GSON 和 ObjectBox (GreenDao)
你 Json 看起来像服务器响应。但是在您的数据库中,您通常只想保存产品实体,而不是答案。因此,最好只有一个 ServerResultPOJO 来使用 GSON 解析您的答案(以下代码未经测试,可能包含一些小错误,它只是为了让您走上正确的道路)。
public class ServerResultPOJO {
@SerializedName("open")
private boolean open;
@SerializedName("total_products")
private Long total_products;
@SerializedName("product")
private List<Product> products;
}
你的产品 class 然后可以是一个 ObjectBox (GreenDao) 实体
@Entity
public static class Product{
@Id
private long id;
@Index
@SerializedName("p_id")
private Long p_id;
@SerializedName("price")
@Property(nameInDb = "price")
private String price;
@SerializedName("name")
@Property(nameInDb = "name")
private String name;
//Getters & Setters
}
[最好不要使用服务器 ID 作为您的数据库实体 ID。分别保存 id 和服务器 id。自动增量和其他东西不会混淆]
那么你不需要任何转换器,只需要一些方法将你答案中的所有产品放入数据库 - 在放置新实体之前你可以搜索 p_id 以检查你是否需要同步到放入之前的数据库。
因此,首先解析您的答案,然后执行数据库操作。
如果您真的希望将 Response 作为数据库实体,则需要一对多关系。但是你不能对实体和 GSON 解析使用相同的 classes,或者你使用一些 @transient 字段,使事情变得更加复杂。
是因为
"GSON Expected BEGIN_ARRAY but was BEGIN_OBJECT"
应该这样做:
JsonParser parser = new JsonParser();
JsonObject rootObject = parser.parse(JSON_STRING).getAsJsonObject();
//You can get the "open" and "total_products" here too.//
JsonElement productElement = rootObject.get("product");
Gson gson = new Gson();
List<Product> productList = new ArrayList<>();
//Check if "data" element is an array or an object and parse accordingly...
if (productElement.isJsonObject()) {
//The returned list has only 1 element
Product p = gson.fromJson(productElement, Product.class);
productList.add(p);
}
else if (productElement.isJsonArray()) {
//The returned list has >1 elements
Type productListType = new TypeToken<List<Product>>() {}.getType();
productList = gson.fromJson(productElement, productListType);
}
[来源:]
这是我的样本JSON:
{
"open":true,
"total_products":100,
"product":[
{
"p_id":1,
"price":"5.00",
"name":"blah one"
},
{
"p_id":2,
"price":"15.00",
"name":"blah two"
},
...
]
}
这是我的 POJO class:
@Entity(nameInDb = "products")
public class ProductsPOJO {
@SerializedName("open")
@Property(nameInDb = "open")
private boolean open;
@SerializedName("total_products")
@Property(nameInDb = "total_products")
private Long total_products;
@Convert(converter = ProductConverter.class, columnType = String.class)
@SerializedName("product")
@Property(nameInDb = "product")
private Product product;
public static class productConverter implements PropertyConverter<Product, String> {
//What shoudl I write in convert part?!
@Override
public Product convertToEntityProperty(String databaseValue) {
if (databaseValue == null) {
return null;
}
for (Product p : Product.values()) {
if (p.id == databaseValue) {
return p;
}
}
return Product.DEFAULT;
}
@Override
public String convertToDatabaseValue(Product entityProperty) {
return entityProperty == null ? null : entityProperty.;
}
//
/*@Override
public Product convertToEntityProperty(String databaseValue) {
return Product.valueOf(databaseValue);
}
@Override
public String convertToDatabaseValue(Product entityProperty) {
return entityProperty.name();
}*/
}
public static class Product{
@Id
@SerializedName("p_id")
private Long p_id;
@SerializedName("price")
@Property(nameInDb = "price")
private String price;
@SerializedName("name")
@Property(nameInDb = "name")
private String name;
//Getters & Setters
}
public Product getProduct() {
return product;
}
public void setProduct(Product data) {
this.product = product;
}
//open & total_products Getters & Setters
}
但是我不知道productConverter
应该写什么。
另一方面,Product
class 中的字段有多种类型。 String
和 Integer
.
我读了这些:
https://github.com/greenrobot/greenDAO/blob/V3.1.1/examples/DaoExample/src/main/java/org/greenrobot/greendao/example/Note.java#L26-L27
编辑: :/我在这里也混淆了两件事,greenrobot objectbox 和 greendao ...抱歉,但答案保持不变,只需将 objectbox 替换为 greendao :)
在我看来,你在这里混淆了 GSON 和 ObjectBox (GreenDao)
你 Json 看起来像服务器响应。但是在您的数据库中,您通常只想保存产品实体,而不是答案。因此,最好只有一个 ServerResultPOJO 来使用 GSON 解析您的答案(以下代码未经测试,可能包含一些小错误,它只是为了让您走上正确的道路)。
public class ServerResultPOJO {
@SerializedName("open")
private boolean open;
@SerializedName("total_products")
private Long total_products;
@SerializedName("product")
private List<Product> products;
}
你的产品 class 然后可以是一个 ObjectBox (GreenDao) 实体
@Entity
public static class Product{
@Id
private long id;
@Index
@SerializedName("p_id")
private Long p_id;
@SerializedName("price")
@Property(nameInDb = "price")
private String price;
@SerializedName("name")
@Property(nameInDb = "name")
private String name;
//Getters & Setters
}
[最好不要使用服务器 ID 作为您的数据库实体 ID。分别保存 id 和服务器 id。自动增量和其他东西不会混淆]
那么你不需要任何转换器,只需要一些方法将你答案中的所有产品放入数据库 - 在放置新实体之前你可以搜索 p_id 以检查你是否需要同步到放入之前的数据库。
因此,首先解析您的答案,然后执行数据库操作。
如果您真的希望将 Response 作为数据库实体,则需要一对多关系。但是你不能对实体和 GSON 解析使用相同的 classes,或者你使用一些 @transient 字段,使事情变得更加复杂。
是因为
"GSON Expected BEGIN_ARRAY but was BEGIN_OBJECT"
应该这样做:
JsonParser parser = new JsonParser();
JsonObject rootObject = parser.parse(JSON_STRING).getAsJsonObject();
//You can get the "open" and "total_products" here too.//
JsonElement productElement = rootObject.get("product");
Gson gson = new Gson();
List<Product> productList = new ArrayList<>();
//Check if "data" element is an array or an object and parse accordingly...
if (productElement.isJsonObject()) {
//The returned list has only 1 element
Product p = gson.fromJson(productElement, Product.class);
productList.add(p);
}
else if (productElement.isJsonArray()) {
//The returned list has >1 elements
Type productListType = new TypeToken<List<Product>>() {}.getType();
productList = gson.fromJson(productElement, productListType);
}
[来源:]