【问题标题】:Professional way to handle model classes when using GSON and SQLight Android app使用 GSON 和 SQLight Android 应用程序时处理模型类的专业方法
【发布时间】:2023-04-10 02:06:01
【问题描述】:

在我的应用程序中,我从 Web 服务获取数据并在回收站视图中显示这些数据。之后,我计划将这些数据添加到本地 sqlite 数据库中,并在用户在没有互联网连接的情况下打开应用程序时显示这些数据。

这是我用来使用 GSON 解析 JSON 结果的简单模型类

public class Repo implements Parcelable {

    @SerializedName("id")
    @Expose
    private Integer id;

    @SerializedName("name")
    @Expose
    private String name;

    @SerializedName("url")
    @Expose
    private String url;


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeValue(this.id);
        dest.writeString(this.name);
        dest.writeString(this.url);
    }

    public Repo() {
    }

    protected Repo(Parcel in) {
        this.id = (Integer) in.readValue(Integer.class.getClassLoader());
        this.name = in.readString();
        this.url = in.readString();
    }

    public Integer getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getUrl() {
        return url;
    }

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

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

    public void setUrl(String url) {
        this.url = url;
    }

    public static final Creator<Repo> CREATOR = new Creator<Repo>() {
        @Override
        public Repo createFromParcel(Parcel source) {
            return new Repo(source);
        }

        @Override
        public Repo[] newArray(int size) {
            return new Repo[size];
        }
    };
}

我可以创建一个几乎相同的模型类来表示 SQLite 数据。在这里,我使用的是 ORMlite。但这与其他 ORM 的情况非常相似。

@DatabaseTable(tableName = Repo.TABLE_NAME)
public class Repo {

    public static final String TABLE_NAME = "repo";

    @DatabaseField(columnName = "repo_id")
    private long repoId;

    @DatabaseField(columnName = "name")
    private String name;

    public long getRepoId() {
        return repoId;
    }

    public String getName() {
        return name;
    }

    public void setRepoId(long repoId) {
        this.repoId = repoId;
    }

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

但是当我尝试将这些数据保存到 SQLite 数据库时,我已经在 GSON 模型类中设置了数据对象。这是一种从 GSON 模型复制对象并将该值设置为 SQLite 模型的冗余事物。所以我想出了下面的解决方案,尝试使用单个模型类来表示两者。

@DatabaseTable(tableName = Repo.TABLE_NAME)
public class Repo implements Parcelable {

    public static final String TABLE_NAME = "repo";

    @DatabaseField(columnName = "repo_id")
    @SerializedName("id")
    @Expose
    private Integer id;

    @DatabaseField(columnName = "name")
    @SerializedName("name")
    @Expose
    private String name;

    @SerializedName("url")
    @Expose
    private String url;


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeValue(this.id);
        dest.writeString(this.name);
        dest.writeString(this.url);
    }

    public Repo() {
    }

    protected Repo(Parcel in) {
        this.id = (Integer) in.readValue(Integer.class.getClassLoader());
        this.name = in.readString();
        this.url = in.readString();
    }

    public Integer getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getUrl() {
        return url;
    }

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

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

    public void setUrl(String url) {
        this.url = url;
    }

    public static final Creator<Repo> CREATOR = new Creator<Repo>() {
        @Override
        public Repo createFromParcel(Parcel source) {
            return new Repo(source);
        }

        @Override
        public Repo[] newArray(int size) {
            return new Repo[size];
        }
    };
}

我已经尝试过使用不同类型的模型类,它只有String 类型字段。由于 GSON 使用像 Integer,Boolean 这样的类型,这阻止了我对 SQLite 使用相同的模型,因为数据库没有将 Integer 识别为一种类型,为了工作它需要是 int

那么专业的处理方法是什么?除了回到创建两个单独的模型类来表示 SQLite 和 GSON 的方法之外,我没有任何其他选择。

【问题讨论】:

  • 由于 GSON 使用 Integer,Boolean 等原始类型 Integer 不是原始类型,Boolean 也不是原始类型 ...定义 数据库不识别 Integer i> ... SQLite 对 java 类型一无所知
  • 感谢您指出。已编辑。

标签: android sqlite gson ormlite


【解决方案1】:

你的方法是绝对正确的,但我认为你在重新发明轮子上付出了太多的努力

您可以使用Room 轻松完成所描述的任务

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2016-05-11
    • 2017-10-03
    • 1970-01-01
    • 2011-11-03
    • 2023-03-15
    相关资源
    最近更新 更多