29

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

外部APIを介してデータを受信し、ORMLiteを使用してローカルにデータを保存するAndroidアプリを開発しています。データをローカルに保存して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はを含むJSONオブジェクトImagesです。

現在、データをローカルにも保存しようとしています。ORMLiteを使用してユーザーと画像の関係を確立するには、ForeignCollectionクラスと@ForeignCollectionFieldアノテーションを使用する必要があるようです。GsonがUserクラスのフィールドのJsonをForeignCollectionオブジェクトとして直接解析できるとは思わないので、2つのフィールドとmediaを作成する必要があると思いました。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同じビューでを表示する必要があります。現在のところ、のURLはImage、データがローカルかリモートかに応じて、さまざまなタイプのオブジェクトに保存されます。私がやりたいのは、がオブジェクトにImage格納されているForeginCollection場合、そのオブジェクトをに変換してから、 URLArrayListを抽出して表示する残りのコードに進むことです。Image

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

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

  2. それ良い計画である場合、どうすればaForeginCollectionをに変換できArrayListますか?

4

3 に答える 3

21

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

動作するはずです。それ以外の方法でそれを行う簡単な方法はわかりません。

いくつかのポイント:

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

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

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

media = new ArrayList<Image>(mediaCollection);

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

于 2012-10-03T14:07:52.947 に答える
2

@ForeignCollectionFieldからあなたに変換するだけArrayList<Object> でそれを行うことができます:

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

お役に立てば幸いです。

于 2015-03-11T13:56:07.890 に答える
0

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

于 2012-10-02T23:59:50.910 に答える