説明が明確でない場合はお詫び申し上げますが、必要に応じて、この質問を追加して編集し、わかりやすくします。
私はAndroidアプリを開発しています。このアプリは、外部APIを介してデータを受信し、ORMLiteを使用してデータをローカルに保存します。データをローカルに保存してORMLiteを使用する前に、サーバーからJSONを取得して解析するモデルがありました。 :
Gson gson = new Gson();
String result = ApiClient.httpPost("/user_route");
User user = gson.fromJson(result, User.class);
Userクラスが定義されました
public class User {
int id;
String name;
ArrayList<Image> media;
}
そしてImageクラス:
public class Image {
int id;
int creator_id;
String url;
}
これはモデルとメソッドの簡略化された表現ですが、私はすべての関連情報を保持していると思います。ところで、media
は、Images
を含むJSONオブジェクトです。
現在、データをローカルにも保存しようとしています。 ORMLiteを使用してユーザーと画像の関係を確立するには、ForeignCollectionクラスと@ForeignCollectionFieldアノテーションを使用する必要があるようです。 GsonがUserクラスのmedia
フィールドのJsonをForeignCollectionオブジェクトとして直接解析できるとは思わないので、2つのフィールドmediaCollection
とmedia
を作成する必要があると思いました。
ORMLiteを使用すると、Userクラスは次のようになります。
@DatabaseTable(tableName = "Users")
public class User {
@DatabaseField(generatedId = true)
int id;
@DatabaseField
String name;
@ForeignCollectionField
ForeignCollection<Image> mediaCollection;
ArrayList<Image> media;
}
ORMLiteのImageクラスは次のようになります。
@DatabaseTable(tableName = "Images")
public class Image {
@DatabaseField(generatedId = true)
int id;
@DatabaseField(foreign=true, foreignAutoCreate=true, foreignAutoRefresh=true)
private User user;
@DatabaseField
int creator_id;
@DatabaseField
String url;
}
アプリのフローがどのように機能するかは、最初にユーザーのローカルデータベースにアクセスします。ユーザーデータを「更新」または「更新」するために実際にサーバーにアクセスする必要があるかどうかを判断するロジックを実行します。
データがローカルにあるかリモートサーバーからのものであるかにかかわらず、同じビューにImage
を表示する必要があります。現在のところ、Image
のURLは、データがローカルかリモートかに応じて、さまざまなタイプのオブジェクトに保存されます。私がやりたいのは、Image
がForeginCollection
オブジェクトに格納されている場合、そのオブジェクトをArrayList
に変換してから、Image
URLを抽出して表示する残りのコードに進むことです。
2つの質問があると思います。
これは良い計画ですか、それともオブジェクトをImage
からForeignCollection
に変換するのではなく、データからArrayList
URLを抽出する2つの完全に別個の方法を書く必要がありますか?
is良い計画の場合、ForeginCollection
をArrayList
に変換するにはどうすればよいですか?
これは良い計画ですか、それともオブジェクトをForeignCollectionからArrayListに変換するのではなく、データから画像URLを抽出する2つの完全に別個の方法を書く必要がありますか?
動作するはずです。そうでなければ、それを行う簡単な方法がわかりません。
いくつかのポイント:
ForeignCollection
を一時的なものとしてマークして、JSON経由で転送するときに無視されるようにする方法はありますか?次に、JSONとORMLiteの両方に同じUser
オブジェクトを使用できます。hydrate()
メソッドが適切なので、media
-> mediaCollection
から変換します。その逆も同様です。Dao.getEmptyForeignCollect(...)
メソッドを使用する必要があります。コレクションを取得したら、画像をコレクションに追加すると、それらがテーブルに追加されます。それが良い計画である場合、ForeignCollectionをArrayListに変換するにはどうすればよいですか?
これは簡単です。 ForeignCollection
はCollection
です。あなたはただすることができます:
_media = new ArrayList<Image>(mediaCollection);
_
したがって、User.getMedia()
メソッドはnull
をチェックし、チェックする場合はmediaCollection
フィールドから変換する必要があります。
@ForeignCollectionField
からArrayList<Object>
に変換するには、次のようにします。
ArrayList<Object> taskFieldsList = new ArrayList<Object>(your collection);
それがあなたの助けになることを願っています。
最初にオブジェクトをデータベースに保存してから、ormliteにForeignCollectionでオブジェクトを取得させる以外に、ForeignCollectionを作成することはできません。 ForeignCollectionの代わりにCollectionを使用できますが、同じように機能します。私がしていることは次のとおりです。親クラスに2つのコレクションがあります。 1つは、jsonまたはxmlが逆シリアル化されるArrayListです。親オブジェクトが格納されると、daoはArraylist内のオブジェクトを、他のコレクションであるForeignCollectionにリンクされているテーブル内のデータベースに格納します。親オブジェクトが取得されると、ForeignCollection内のオブジェクトが自動的に含まれます。完璧ではありませんが、機能します。