Подтвердить что ты не робот

Преобразование 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);

Определен класс пользователя

public class User {
  int id;
  String name;
  ArrayList<Image> media;
}

И класс Image:

public class Image {
  int id;
  int creator_id;
  String url;
}

Это упрощенное представление моделей и методов, но я считаю, что я сохранил всю необходимую информацию. BTW, media - это объект JSON, который содержит Images.

Теперь я пытаюсь также хранить данные локально. Чтобы иметь отношения между пользователями и изображениями с использованием ORMLite, кажется, вам нужно использовать класс ForeignCollection и аннотацию @ForeignCollectionField. Я не верю, что Gson может напрямую разобрать Json для поля media в классе User как объект ForeignCollection, поэтому мне показалось, что мне нужно создать два поля 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;
}

Класс Image с ORMLite выглядит так:

@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, преобразует этот объект в ArrayList, а затем продолжит работу с остальным кодом, который извлекает URL Image и отображает его.

Я думаю, есть два вопроса.

  • Является ли это хорошим планом или мне нужно написать два совершенно разных способа извлечения URL-адреса Image из данных, НЕ преобразовывая объект из ForeignCollection в ArrayList?

  • Если это хороший план, как мне преобразовать ForeginCollection в ArrayList?

4b9b3361

Ответ 1

Является ли это хорошим планом или мне нужно написать два совершенно разных способа извлечения URL-адреса изображения из данных, не преобразовывая объект из ForeignCollection в ArrayList?

Он должен работать. Я не вижу в этом простого способа сделать это.

Некоторые моменты:

  • Есть ли способ отметить ForeignCollection как переходный процесс, поэтому он игнорируется при передаче через JSON? Затем вы можете использовать один и тот же объект User для JSON и ORMLite.
  • Какой-то метод hydrate() был бы хорош, поэтому он конвертировал бы из mediamediaCollection и наоборот.
  • Если вам нужно загрузить переданные JSON изображения в чужую коллекцию, вы должны использовать метод Dao.getEmptyForeignCollect(...). Когда у вас есть коллекция, вы можете добавить в нее изображения, и они будут добавлены в таблицы.

Если это хороший план, как мне преобразовать ForeignCollection в ArrayList?

Это проще. A ForeignCollection является Collection. Вы можете просто сделать:

media = new ArrayList<Image>(mediaCollection);

Итак, ваш метод User.getMedia() должен проверить null, и если да, то конвертируйте из поля mediaCollection.

Ответ 2

Просто для преобразования с @ForeignCollectionField в ArrayList<Object> вы можете сделать это:

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

надеюсь, что это поможет вам.

Ответ 3

Вы не можете создать ForeignCollection, кроме первого хранения объектов в базе данных, а затем их ormlite вернуть в ForeignCollection. Вы можете использовать коллекцию вместо ForeignCollection, но она работает одинаково. Я делаю следующее: у меня есть две коллекции в родительском классе. Один из них - ArrayList, в котором json или xml десериализованы. Когда родительский объект хранится, dao сохраняет объекты в Arraylist в базе данных, в таблице, связанной с другой коллекцией, ForeignCollection. Когда родительский объект извлекается, он автоматически содержит объекты в ForeignCollection. Это не идеально, но это работает.