Ormlite ForeignCollection с помощью Gson
Боролся с этим весь день. Я чувствую, что я одна аннотация от правильного решения.
Я получаю JSON из API и анализирую его с помощью Gson внутри запроса Volley в объект. Затем я хочу сохранить объект в БД, используя ORMLite.
Проблема в том, что в моем JSON есть списки других объектов. Поэтому я решил, что ForeignCollection требуются.
Вот упрощенная версия того, что я получаю как JSON:
{
"b": [
{"title"="abc","id="24sfs"},
{"title"="def", "id="532df"}
],
"c": [
{"description"="abc","id="34325"},
{"description"="def", "id="34321"}
],
"id"="ejsa"
}
Давайте назовем весь этот класс объектов A. Объекты внутри "b", это B, внутри "c", класс C.
B и C похожи. Это приводит к следующим определениям классов:
class A {
@DatabaseField(index = true, unique = true, id = true)
private String id;
@ForeignCollectionField(eager = true)
public Collection<B> bCollection;
public ArrayList<B> b;
@ForeignCollectionField(eager = true)
public Collection<C> cCollection;
public ArrayList<C> c;
}
class B {
@DatabaseField(foreign=true)
public A a;
@DatabaseField(id = true, index = true, unique = true)
public String id;
@DatabaseField
public String title;
}
Причина, по которой нам нужен ArrayList b и c, заключается в том, что gson может правильно его проанализировать. Итак, когда у меня есть класс А в памяти, вот что я делаю, чтобы сохранить его
private void storeA(A a) {
if (a.b != null) {
getHelper().getDao(B.class).callBatchTasks(new Callable<Void>() {
@Override
public Void call() throws Exception {
for (B b : a.b) {
b.a = a;
try {
getHelper().getDao(B.class).createOrUpdate(b);
} catch (Exception e) {
}
}
return null;
}
});
}
/*
Here we start running into problems. I need to move the data from the ArrayList to the Collection
*/
a.bCollection = a.b; // but this seems to work, since bCollection is a Collection
a.cCollection = a.c;
getHelper().getDao(A.class).createOrUpdate(a);
}
Так что, похоже, правильно хранит, без ошибок, насколько я могу судить. Но когда я пытаюсь получить следующее, я не могу получить что-либо из bCollection:
private void load() {
try {
List<A> as = getHelper().getDao(A.class).queryForEq("id", "ejsa");
if (as != null && as.size() > 0) {
A a = as.get(0);
CloseableWrappedIterable<B> cwi = a.bCollection.getWrappedIterable();
try {
for (B b : cwi) {
Log.e(b.title);
}
} finally {
cwi.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
Что я делаю неправильно? Нужно ли указывать ForeignColumnName для некоторых из этих вещей? Я не могу сказать, правильно ли хранятся вещи или я просто не могу правильно их найти?
1 ответ
Я бы попытался удалить следующие две строки:
a.bCollection = a.b;
a.cCollection = a.c;
Как ForeignCollection
ORMLite должен автоматически заполнять вас автоматически, когда вы запрашиваете A, вам не нужно устанавливать их самостоятельно.