Я пишу приложение для 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-объектом (моделью). Однако единственный способ, которым я могу решить эту проблему, - это использовать один объект для хранения данных, возвращаемых из сети, и другой аналогичный объект, который сопоставляется с БД, но кажется хакерским. Может кто-то указать мне верное направление?