Преобразование 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
?
Ответы
Ответ 1
Является ли это хорошим планом или мне нужно написать два совершенно разных способа извлечения URL-адреса изображения из данных, не преобразовывая объект из ForeignCollection в ArrayList?
Он должен работать. Я не вижу в этом простого способа сделать это.
Некоторые моменты:
- Есть ли способ отметить
ForeignCollection
как переходный процесс, поэтому он игнорируется при передаче через JSON? Затем вы можете использовать один и тот же объект User
для JSON и ORMLite.
- Какой-то метод
hydrate()
был бы хорош, поэтому он конвертировал бы из media
→ mediaCollection
и наоборот.
- Если вам нужно загрузить переданные 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. Это не идеально, но это работает.