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;

Как ForeignCollectionORMLite должен автоматически заполнять вас автоматически, когда вы запрашиваете A, вам не нужно устанавливать их самостоятельно.

Другие вопросы по тегам