Передача данных с сервера в базу данных SQLite клиента Android с использованием ActiveAndroid

Я пишу приложение для Android, которому необходимо загружать данные с сервера и сохранять данные в базе данных SQLite на клиенте Android. Я разбил эту проблему на два этапа:

1) получить данные с сервера и заполнить модель на клиенте Android. 2) сохранить данные из модели в базе данных SQLite на клиенте Android.

Я успешно выполнил шаг 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, и вот трассировка стека:

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

Трассировка стека заставляет меня поверить, что у моей сетевой библиотеки (ION) возникают проблемы с сопоставлением JSON (с использованием GSON) с моим java-объектом (моделью). Однако единственный способ, которым я могу решить эту проблему, - это использовать один объект для хранения данных, возвращаемых из сети, и другой аналогичный объект, который сопоставляется с БД, но кажется хакерским. Может кто-то указать мне верное направление?


person neonDion    schedule 09.04.2014    source источник


Ответы (1)


Я знаю, что уже поздно, но проблема в том, что gson пытается сериализовать Class<?> в com/activeandroid/TableInfo.java.

Вы можете просто установить для поля mType значение transient в com/activeandroid/TableInfo.java, так как вам все равно не нужно сериализовать это поле:

private transient Class<? extends Model> mType;

Или вы можете работать с аннотацией @Expose и сделать что-то вроде:

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

Или даже проверить Стратегию исключения Gson< /а>

person vinitius    schedule 10.01.2015