サーバーからデータをダウンロードし、Android クライアントの SQLite データベースにデータを保持する必要がある Android アプリを作成しています。この問題を 2 つのステップに分けました。
1) サーバーからデータを取得し、Android クライアントにモデルを設定します。2) モデルからのデータを Android クライアントの SQLite DB に永続化します。
ステップ 1 は正常に実装されましたが、ステップ 2 で問題が発生しています。
ステップ2を支援するためにActiveAndroidを使用することにしました。ただし、これを行う方法について混乱しています。私の主な問題点は、現在のモデルで 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 オブジェクト (モデル) にマッピングする際に問題が発生していると思われます。ただし、これを解決するために考えることができる唯一の方法は、ネットワークから返されたデータを格納するために 1 つのオブジェクトを使用し、DB にマップされているがハッキーに見える別の同様のオブジェクトを使用することです。誰かが私を正しい方向に向けることができますか?