Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 网络pojo类和数据库实体类,如何避免重复_Android_Rest_Retrofit2_Android Room_Android Architecture Components - Fatal编程技术网

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

Android 网络pojo类和数据库实体类,如何避免重复,android,rest,retrofit2,android-room,android-architecture-components,Android,Rest,Retrofit2,Android Room,Android Architecture Components,对不起,如果怀疑太概念化,我有点经验不足 我通过改造从URL获取JSON数据,并且我还想将这些数据存储在我的SQLite数据库中。为了创建这个数据库,我将使用新的Room ORM映射 我使用androidstudio插件GsonFormat提取网络POJO类,它生成下面的菜谱、配料和步骤类。并生成一些房间图元类(下面将详细介绍) 如您所见,这两组类几乎完全相同,带来了大量重复代码。但我也发现混合使用这两组类并不好。而且Room禁止实体对象相互引用,所以如果我想使用第一组类,它将更加复杂 我的疑问

对不起,如果怀疑太概念化,我有点经验不足

我通过改造从URL获取JSON数据,并且我还想将这些数据存储在我的SQLite数据库中。为了创建这个数据库,我将使用新的Room ORM映射

我使用androidstudio插件GsonFormat提取网络POJO类,它生成下面的菜谱、配料和步骤类。并生成一些房间图元类(下面将详细介绍)

如您所见,这两组类几乎完全相同,带来了大量重复代码。但我也发现混合使用这两组类并不好。而且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 + '\'' +
                '}';
    }
}

您可以使用一个同时满足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对象,带有特定的注释,以帮助其他框架正确使用它

> P>有2个解决方案我可以考虑,并且你必须考虑到系统的预期设计目标: 1.通过最小化重复,例如在组合两个类时使用本线程中列出的方法之一,响应对象和实体对象现在紧密耦合。如果您确信响应中的所有字段都适合始终作为房间实体使用,那么这是很好的

2.我们不减少重复,而是允许它发生,以利于更大的可扩展性


通常在我的项目中,我个人更喜欢第二种方法,因为没有直接依赖关系,我不必存储不必要的字段(有时我将一些字段存储为元数据而不是使用Room),另外,我不必每次响应更改时都编写迁移代码。

我建议您将它们分开存放在不同的库中(数据传输、持久性等),但要有“主”域对象,它将在您的业务服务层中工作。原因是不同的库可能需要不同的DTO实现:一些库需要公共方法,一些库需要构造函数,一些库需要特殊命名的方法,等等。我会将它们解耦,以便在需要的情况下轻松替换库。这当然会行得通,但随着时间的推移,事情开始变得一团糟,这有助于避免重复并保持代码整洁。为什么你认为它会很混乱?对于不完全同质的类和具有许多属性的类,我认为随着类的增长,管理变得更加复杂。但是对于这个简单的例子,我按照你所说的方式实现了它,并且效果很好。当然,我的答案集中在你关于简洁性和删除重复代码的问题上,因此如果我们遇到一些微妙的问题,我们可以返回到更优化的解决方案。顺便说一句,我非常感谢您将其标记为已接受的答案。
@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;
  ....
}