使用GSON和SQLight Android应用程序时处理模型类的专业方法

时间:2017-10-16 09:37:59

标签: android sqlite gson ormlite

在我的应用程序中,我从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使用类似IntegerBoolean的类型,因为数据库不将Integer标识为类型,因此阻止我使用相同的SQLite模型,为了工作,它需要{{1 }}

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

1 个答案:

答案 0 :(得分:0)

Yout方法是绝对正确的,但我认为你正在投入太多精力重新发明轮子

您可以使用Room

轻松完成所述任务