【问题标题】:could the POJO used for Gson reused for the class used with Room用于 Gson 的 POJO 是否可以重用于与 Room 一起使用的类
【发布时间】:2017-08-16 12:32:14
【问题描述】:

使用 Gson 时,它创建了 POJO,用于解析/序列化来自远程服务的 json 数据结果。可能有一些Gson的注解

public class User {
    @SerializedName(“_id”)
    @Expose
    public String id;
    @SerializedName(“_name”)
    @Expose
    public String name;
    @SerializedName(“_lastName”)
    @Expose
    public String lastName;

    @SerializedName(“_age”)
    @Expose
    public Integer age;
}

但是对于使用 with Room 的类,它可能有自己的注解:

import android.arch.persistence.room.Entity;
import android.arch.persistence.room.PrimaryKey;

@Entity
public class User {
    public @PrimaryKey String id;
    public String name;
    public String lastName;
    public int age;
}

这两个是否可以与来自两个库的所有注释合并为一个(如果存在注释冲突(希望没有),则必须使用长包名来解决)?

【问题讨论】:

  • 我不希望任何一个库的注释会干扰另一个库的注释。
  • 我认为你不会有任何问题。每个框架都处理自己的注释类并处理内部的元数据。
  • 我不希望它们发生冲突。你试过了吗?

标签: android android-room gson


【解决方案1】:

是的,您可以为 room 和 gson 创建一个 pojo 类。 以及当向服务器请求时,如果没有在服务器中发送任何数据,则使用 transient 关键字,如果您不想插入任何使用的字段表 @Ignore

在下面的代码中用于 gson 和 room..

 @Entity
public class User {

    @PrimaryKey(autoGenerate = true)
    @SerializedName("_id")
    @ColumnInfo(name = "user_id")
    public long userId;
    @SerializedName("_fName")
    @ColumnInfo(name = "first_name")
    private String name;

    public long getUserId() {
        return userId;
    }

    public void setUserId(long userId) {
        this.userId = userId;
    }

    public String getName() {
        return name;
    }

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

【讨论】:

    【解决方案2】:

    它会起作用,但将来可能会导致一些问题,因此不推荐用于干净的软件设计。请参阅此演讲:Marko Miloš: Clean architecture on Android

    正如所指出的,您应该为您的 db 和 webresults/json 使用不同的实体并在它们之间进行转换。

    【讨论】:

    • 他具体推荐什么?我们应该复制 pojo 类吗?
    • 他基本上说,由于它们在不同的层上工作,清晰的架构建议为每种情况使用不同的类
    猜你喜欢
    • 2023-03-12
    • 2020-10-19
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多