【发布时间】: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