使用ActiveAndroid将数据从服务器传输到Android客户端的SQLite数据库

时间:2014-04-09 21:09:33

标签: android sqlite activeandroid

我正在编写一个Android应用程序,需要从服务器下载数据并将数据保存在Android客户端上的SQLite数据库中。我把这个问题分解为两个步骤:

1)从服务器获取数据并在android客户端上填充模型。 2)在Android客户端的SQLite DB中保存模型中的数据。

我已成功实施第1步,但遇到第2步的问题。

我决定使用ActiveAndroid来帮助完成第2步。我对如何做到这一点很困惑。我的主要观点是我是否应该在当前模型中使用ActiveAndroid的@Column()和@Table()注释。此模型目前在服务器调用(使用ION库进行网络连接)后填充,所以我只是将这些注释直接添加到该模型中吗?我试过这个并得到一个StackOverflowError。

这是我正在使用的模型:

@Table(name = "Issue")
public class Issue extends Model {

private static final long serialVersionUID = 0L;

@Column(name = "uid")
@SerializedName("id")
public int id;
@Column(name = "name")
public String name;
@Column(name = "created_at")
public String created_at;
@Column(name = "updated_at")
public String updated_at;
@Column(name = "description")
public String description;
@Column(name = "conference_number")
public String conference_number;
@Column(name = "hash_key")
public String hash_key;
@Column(name = "owner_id")
public int owner_id;
@Column(name = "categories_updated_at")
public String categories_updated_at;
@Column(name = "deleted_at")
public String deleted_at;
@Column(name = "status")
public String status;
@Column(name = "external_reference_id")
public String external_reference_id;
@Column(name = "messages_updated_at")
public String messages_updated_at;
@Column(name = "unknowns_updated_at")
public String unknowns_updated_at;
@Column(name = "facts_updated_at")
public String facts_updated_at;
@Column(name = "action_items_updated_at")
public String action_items_updated_at;
@Column(name = "uploads_updated_at")
public String uploads_updated_at;
@Column(name = "involvements_updated_at")
public String involvements_updated_at;
}

如果,在上面的代码中,我删除了所有注释,并删除了“扩展模型”,我留下的代码解决了我在步骤#1中遇到的问题。但是,使用上面的代码我得到一个StackOverFlow错误,这里是stacktrace:

java.lang.StackOverflowError
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
            at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:355)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:117)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
            at com.google.gson.Gson.getAdapter(Gson.java:356)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
            at com.google.gson.Gson.getAdapter(Gson.java:356)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
            at com.google.gson.Gson.getAdapter(Gson.java:356)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
            at com.google.gson.Gson.getAdapter(Gson.java:356)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
            at com.google.gson.Gson.getAdapter(Gson.java:356)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
            at com.google.gson.internal.bind.ReflectiveTypeAdapter

stacktrace让我相信我的网络库(ION)在将JSON(使用GSON)映射到我的java对象(模型)时遇到了麻烦。然而,我能想到解决这个问题的唯一方法是使用一个对象来存储从网络返回的数据,另一个类似的对象映射到数据库,但看起来很糟糕。谁能指出我正确的方向?

1 个答案:

答案 0 :(得分:1)

我知道现在已经很晚但问题是gson尝试在Class<?>序列化com/activeandroid/TableInfo.java

您可以在mTypetransient字段设置为com/activeandroid/TableInfo.java,因为您无需将此字段序列化:

private transient Class<? extends Model> mType;

或者您可以使用@Expose注释并执行以下操作:

new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

甚至结帐Gson Exclusion Strategy