【问题标题】:Custom type in GreenDao with POJO class带有 POJO 类的 GreenDao 中的自定义类型
【发布时间】:2017-10-20 08:17:43
【问题描述】:

这是我的 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 类:

@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 类中的字段有多种类型。 StringInteger.
我读了这些: https://github.com/greenrobot/greenDAO/blob/V3.1.1/examples/DaoExample/src/main/java/org/greenrobot/greendao/example/Note.java#L26-L27

http://greenrobot.org/greendao/documentation/custom-types/

【问题讨论】:

    标签: java android json pojo greendao


    【解决方案1】:

    编辑: :/我在这里也混淆了两个东西,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;
    }
    

    您的 Prdouct 类可能是 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 和服务器 id。自动增量和其他东西不会混淆]

    您不需要任何转换器,只需一些方法即可将您答案中的所有产品放入数据库 - 在放入新实体之前,您可以搜索 p_id 以检查是否需要在放入之前同步到数据库。

    所以首先解析你的答案,然后执行数据库操作。

    如果你真的希望 Response 作为一个数据库实体,你需要一个一对多的关系。但是,您不能将相同的类用于实体和 GSON 解析,或者您使用一些 @transient 字段,这会使事情变得更加复杂。

    【讨论】:

      【解决方案2】:

      因为

      “GSON 应为 BEGIN_ARRAY,但为 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);
      }
      

      [来源:https://stackoverflow.com/a/16656096/421467]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-29
        • 1970-01-01
        • 2014-08-28
        • 2012-09-29
        • 2017-06-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多