当前位置: 首页 > 知识库问答 >
问题:

带有POJO类的GreenDao中的自定义类型

乔伯寅
2023-03-14

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

但是我不知道我应该为< code>productConverter写些什么。< br >另一方面,< code>Product类中的字段有多种类型。< code >字符串和< code >整数。< br >我看了这些:https://github . com/green robot/green Dao/blob/v 3 . 1 . 1/examples/Dao example/src/main/Java/org/green robot/green Dao/example/note . Java # L26-L27

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

共有2个答案

琴俊良
2023-03-14

那是因为

" 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 ]

慕俊迈
2023-03-14

编辑: :/我在这里还混合了两件事,greenrobot objectbox和greendao...很抱歉,但答案保持不变,只需将对象框替换为绿道:)

在我看来,你在这里把一些东西与GSON和ObjectBox(绿道)混淆了

你的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(Green道)实体

@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来检查你是否需要在放入之前同步到数据库。

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

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

 类似资料:
  • 假设我有一个Person模型(Java类和数据库表),它有列/字段,如姓名,年龄,性别,身高,体重。 现在有2种可能 1) 我需要整列数据。。因此,我将命名查询为; @NamedQuery(name=“Person.findAll”,query=“从Person WHERE中选择p…” 2)我只需要特定的列数据...所以我将命名查询为; @NamedQuery(name=“Person.findS

  • 自定义注释 自定义注释处理程序 超级类 子类 Subclass调用SuperClass方法但在不调用 当我将移动到子类method时,AspectHandler可以获取 如何在超类保护方法中使用自定义注释? 更改 但还是不行 所以我把我的< code >子DAO改成了under code 这不是完美的解决方案,但它的工作原理 情况1:从子类方法调用超类方法不起作用 情况 2:使超级类实例和从实例调

  • 我使用以下插件从WordPress REST API获取JSON数据: 高级自定义字段PRO(5.3.7) WP REST API(2.0-beta13) ACF到REST API(2.2.0) 自定义文章类型UI(1.3.4) 我有一个自定义的帖子类型“案例研究”,是用自定义的帖子类型UI插件创建的。我有一个名为“案例研究”的自定义字段组(通过ACF),它仅在文章类型为案例研究时应用。 我还有一

  • 我正在做表A和表B的左连接,并试图将结果提取到自定义POJO中,该POJO具有表A和表B中的字段,如下所示: 它适用于除myCode字段之外的所有字段,myCode字段是连接这两个表的字段。对我来说,myCode的值是从正确的表B中获取的,表A中的所有记录在表B中都没有相应的条目。我想知道jooQ如何决定映射到POJO的字段,以及是否在任何地方记录了这种行为。 我的目标是将表A和表B中的所有字段提

  • Rust 自定义数据类型主要是通过下面这两个关键字来创建: struct: 定义一个结构体 enum: 定义一个枚举类型 而常量的创建可以通过 const 和 static 关键字来创建。