android - 网络pojo类和数据库实体类,如何避免重复

标签 android rest retrofit2 android-room android-architecture-components

如有疑问太概念化,本人经验不足...

我通过改造从 URL 获取 JSON 数据,我还想将此数据存储在我的 SQLite 数据库中。要创建此数据库,我将使用新的 Room ORM 映射。

我使用 Android Studio 插件 GsonFormat 提取网络 POJO 类,它生成下面的 Recipes、Ingredients 和 Steps 类。并生成一些房间实体类(更多内容见下文)

如您所见,两组类几乎完全相同,带来了很多重复的代码。但是我也觉得混用这两组类不好。而且Room禁止实体对象相互引用,所以如果我想利用第一组类,会比较复杂...

我怀疑这些案件一般是如何处理的?

--- Pojo - Gson 可理解:

public class Recipes {

    private int id;
    private String name;
    private int servings;
    private String image;
    private List<Ingredients> ingredients;
    private List<Steps> steps;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getServings() {
        return servings;
    }

    public void setServings(int servings) {
        this.servings = servings;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public List<Ingredients> getIngredients() {
        return ingredients;
    }

    public void setIngredients(List<Ingredients> ingredients) {
        this.ingredients = ingredients;
    }

    public List<Steps> getSteps() {
        return steps;
    }

    public void setSteps(List<Steps> steps) {
        this.steps = steps;
    }

    @Override
    public String toString() {
        return "Recipes{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", servings=" + servings +
                ", image='" + image + '\'' +
                ", ingredients=" + ingredients +
                ", steps=" + steps +
                '}';
    }
}

class Ingredients {
    private double quantity;
    private String measure;
    private String ingredient;

    public double getQuantity() {
        return quantity;
    }

    public void setQuantity(double quantity) {
        this.quantity = quantity;
    }

    public String getMeasure() {
        return measure;
    }

    public void setMeasure(String measure) {
        this.measure = measure;
    }

    public String getIngredient() {
        return ingredient;
    }

    public void setIngredient(String ingredient) {
        this.ingredient = ingredient;
    }

    @Override
    public String toString() {
        return "Ingredients{" +
                "quantity=" + quantity +
                ", measure='" + measure + '\'' +
                ", ingredient='" + ingredient + '\'' +
                '}';
    }
}

class Steps {

    private int id;
    private String shortDescription;
    private String description;
    private String videoURL;
    private String thumbnailURL;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getShortDescription() {
        return shortDescription;
    }

    public void setShortDescription(String shortDescription) {
        this.shortDescription = shortDescription;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getVideoURL() {
        return videoURL;
    }

    public void setVideoURL(String videoURL) {
        this.videoURL = videoURL;
    }

    public String getThumbnailURL() {
        return thumbnailURL;
    }

    public void setThumbnailURL(String thumbnailURL) {
        this.thumbnailURL = thumbnailURL;
    }

    @Override
    public String toString() {
        return "Steps{" +
                "id=" + id +
                ", shortDescription='" + shortDescription + '\'' +
                ", description='" + description + '\'' +
                ", videoURL='" + videoURL + '\'' +
                ", thumbnailURL='" + thumbnailURL + '\'' +
                '}';
    }
}

---房间实体类

@Entity
public class Recipe {

    @PrimaryKey
    private int id;

    private String name;
    private int servings;
    private String image;

}


@Entity(foreignKeys = @ForeignKey(entity = Recipe.class,
        parentColumns = "id",
        childColumns = "recipeId"))
public class Ingredient {

    @PrimaryKey
    private int id;
    private double quantity;
    private String measure;
    private String ingredient;


    private int recipeId;

}

最佳答案

您可以使用一个同时满足 Gson 和 Room 映射的对象类。

例如。

@Entity
public class Recipe {
  @PrimaryKey           // Room annotation
  @SerializedName("id") // Gson annotation
  private int id;

  @ColumnInfo(name = "name") // Room annotation
  @SerializedName("name")    // Gson annotation
  private String name;
  ....
}

在编译过程中,Gson 和 Room 会寻找注解来映射到正确的实体。
一般来说,它们只是带有特定注释的普通 POJO 对象,以帮助其他框架正确使用它。

关于android - 网络pojo类和数据库实体类,如何避免重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44147824/

相关文章:

rest - 通过 REST API、POST 将工件发布到 Nexus

java - php : reading json arraylist and saving data in mysql?

android - 在 safeArgs 中将 ArrayList 作为参数传递

android - 即使手机处于静音/请勿打扰模式也能播放声音

rest - 返回空列表VS的“确定”。无内容

javascript - hapi.js 处理错误的最佳方式

android - 如何上传文件到谷歌驱动器。是否可以通过 Retrofit 2

java - Retrofit 2 GET请求响应方法中的空指针异常

android - 使用Gradle从APK中删除库项目

android - Android HttpPost从Youtube获取 “Invalid request URI”