在我的应用程序中,我从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
的类型,因为数据库不将Integer
标识为类型,因此阻止我使用相同的SQLite模型,为了工作,它需要{{1 }}
那么处理这个问题的专业方法是什么?除了回到创建两个单独的模型类来表示SQLite和GSON的方法之外,我没有任何其他选项。