web-dev-qa-db-ja.com

ForeignCollectionをArrayListに変換します-ORMLite、GsonおよびAndroid

説明が明確でない場合はお詫び申し上げますが、必要に応じて、この質問を追加して編集し、わかりやすくします。

私は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つのフィールドmediaCollectionmediaを作成する必要があると思いました。

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は、データがローカルかリモートかに応じて、さまざまなタイプのオブジェクトに保存されます。私がやりたいのは、ImageForeginCollectionオブジェクトに格納されている場合、そのオブジェクトをArrayListに変換してから、ImageURLを抽出して表示する残りのコードに進むことです。

2つの質問があると思います。

  1. これは良い計画ですか、それともオブジェクトをImageからForeignCollectionに変換するのではなく、データからArrayList URLを抽出する2つの完全に別個の方法を書く必要がありますか?

  2. is良い計画の場合、ForeginCollectionArrayListに変換するにはどうすればよいですか?

29
wuliwong

これは良い計画ですか、それともオブジェクトをForeignCollectionからArrayListに変換するのではなく、データから画像URLを抽出する2つの完全に別個の方法を書く必要がありますか?

動作するはずです。そうでなければ、それを行う簡単な方法がわかりません。

いくつかのポイント:

  • ForeignCollectionを一時的なものとしてマークして、JSON経由で転送するときに無視されるようにする方法はありますか?次に、JSONとORMLiteの両方に同じUserオブジェクトを使用できます。
  • ある種のhydrate()メソッドが適切なので、media-> mediaCollectionから変換します。その逆も同様です。
  • JSONで転送された画像を外部コレクションにロードする必要がある場合は、 Dao.getEmptyForeignCollect(...) メソッドを使用する必要があります。コレクションを取得したら、画像をコレクションに追加すると、それらがテーブルに追加されます。

それが良い計画である場合、ForeignCollectionをArrayListに変換するにはどうすればよいですか?

これは簡単です。 ForeignCollectionCollectionです。あなたはただすることができます:

_media = new ArrayList<Image>(mediaCollection);
_

したがって、User.getMedia()メソッドはnullをチェックし、チェックする場合はmediaCollectionフィールドから変換する必要があります。

21
Gray

@ForeignCollectionFieldからArrayList<Object>に変換するには、次のようにします。

ArrayList<Object> taskFieldsList = new ArrayList<Object>(your collection);

それがあなたの助けになることを願っています。

2
Mohamed Hussien

最初にオブジェクトをデータベースに保存してから、ormliteにForeignCollectionでオブジェクトを取得させる以外に、ForeignCollectionを作成することはできません。 ForeignCollectionの代わりにCollectionを使用できますが、同じように機能します。私がしていることは次のとおりです。親クラスに2つのコレクションがあります。 1つは、jsonまたはxmlが逆シリアル化されるArrayListです。親オブジェクトが格納されると、daoはArraylist内のオブジェクトを、他のコレクションであるForeignCollectionにリンクされているテーブル内のデータベースに格納します。親オブジェクトが取得されると、ForeignCollection内のオブジェクトが自動的に含まれます。完璧ではありませんが、機能します。

0
Christine