Исключение комнаты в неаннотированном классе

У меня есть абстрактный класс, из которого у меня есть два подкласса @Dao:

public abstract class PathBase
{
    private static final String PATH_DELIMITER = "/";

    abstract PathEntity getPath(Long id);
    abstract Long insertInternal(PathEntity row);
    abstract String getDatabase();

    abstract List<Long> getAncestorsInternal(String path);
    abstract List<Long> getDescendantsInternal(String path);
    ...
}

Как только этот класс будет расширен с помощью @Dao:

@Dao public abstract class FolderDao extends PathBase

Я получаю эту ошибку:

ошибка: метод DAO может быть аннотирован только одним из следующих способов: вставка, удаление, запрос, обновление.

для методов:

    abstract PathEntity getPath(Long id);
    abstract Long insertInternal(PathEntity row);
    abstract String getDatabase();

Не жалуется на:

    abstract List<Long> getAncestorsInternal(String path);
    abstract List<Long> getDescendantsInternal(String path);

Даже если бы он отслеживал @Entity класс PathEntity, я понятия не имею, почему он выдает ошибку для abstract String getDatabase();.

Кто-нибудь знает, что здесь происходит... Жучок в номере?


person Anthony    schedule 23.10.2017    source источник


Ответы (2)


FWIW, я получаю сообщение об ошибке для всех пяти ваших методов, а не только для первых трех, когда я вставляю ваш PathBase в проект, заменяю одну из моих сущностей на PathEntity и расширяю свой класс DAO PathBase.

Эти методы не могут быть abstract. Room генерирует реализацию FolderDao, и Room не может реализовать эти методы. Конкретное сообщение об ошибке не идеально, но я не понимаю, как это может работать.

FWIW, я подал заявку на неясное сообщение об ошибке.

person CommonsWare    schedule 23.10.2017
comment
‹вздох› Если бы ошибка выдавала все пять, это сэкономило бы мне немало времени. Эти методы реализованы в FolderDao, но я думаю, что это все еще не работает (я новичок в магических аннотациях). Оглядываясь назад, это не должно иметь большого значения. Я изначально начал этот дизайн с более объектно-ориентированным мышлением, но в любом случае с Room это сложно. Универсальный Dao для обработки всех отношений имеет такое же значение, как и обработка каждого Entity по отдельности. В этом случае весь базовый код можно использовать повторно. - person Anthony; 23.10.2017
comment
@Anthony: Эти методы реализованы в FolderDao, но я думаю, что это все еще не работает (я новичок в магических аннотациях) - я не получаю эту ошибку, когда добавляю реализацию getPath() в свой DAO. Какую версию Room вы используете? Я тестирую с 1.0.0-rc1. - person CommonsWare; 23.10.2017
comment
beta2, попробую обновить. - person Anthony; 23.10.2017
comment
Один из подклассов использовал long вместо Long и отсутствовал getDatabase. Тот, который я не проверял внимательно. Эта модель, очевидно, не будет работать, поскольку она слишком подвержена неоднозначным ошибкам. - person Anthony; 23.10.2017

Для тех, кто сталкивается с подобной ситуацией со сложной основной логикой запроса, в 1.1.0 Room теперь позволяет @RawQery, что позволяет вам самостоятельно реализовать основную логику. Вот как я реализовал это конкретное решение:

https://gist.github.com/rcketscientist/4ded9ae64a770ff6929f27b5dbdbe13a

person Anthony    schedule 09.02.2018