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 мог правильно его проанализировать. Итак, как только у меня есть класс A в памяти, вот что я делаю, чтобы сохранить его

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 для некоторых из этих вещей? Я не могу сказать, хранятся ли вещи неправильно или я просто не могу их правильно извлечь?


person Leo    schedule 08.07.2014    source источник


Ответы (1)


Я бы попробовал удалить следующие две строчки:

a.bCollection = a.b;
a.cCollection = a.c;

При запросе A ForeignCollection должны автоматически заполняться ORMLite за вас, вам не нужно устанавливать их самостоятельно.

person sddamico    schedule 08.07.2014
comment
Хорошо, я удалил это, но я все еще не могу сказать, сохраняется ли что-то, потому что я не могу его восстановить. Если у меня есть объект A, как мне получить из него список B? - person Leo; 09.07.2014
comment
Я ожидал, что ваша функция load(), указанная выше, будет работать ... Чтобы убедиться, что все правильно сохранено в базе данных, я рекомендую вытащить файл sqlite из вашего эмулятора: adb pull /data/data/your.package.name/databases/yourdatabasefilename то вы можете использовать такой инструмент, как sourceforge.net/projects/sqlitebrowser, чтобы убедиться, что вы видите правильные поля внешнего идентификатора заполняются в вашей таблице B. - person sddamico; 10.07.2014
comment
Да, я думаю, что у меня была ошибка в моей функции сохранения. Поменял кое-что еще пару раз, и теперь это работает как шарм. - person Leo; 10.07.2014