Как выполнить объединение в несколько столов DAO для комнаты @Query с использованием полей выбора? - PullRequest
0 голосов
/ 14 января 2020

Моя проблема : Я пытаюсь устранить ошибку компиляции в следующем операторе Room @Query в Room DAO. Как видите, оператор запроса SQLite объединяет различные поля из разных таблиц. Недостающие поля, идентифицированные ошибкой, являются частью конструктора класса Notes, определенного в типе List для метода. Я думаю, что мне нужно изменить указанный тип списка. Если я прав, мне нужно какое-то руководство / предложение о том, как мне это решить. Нужно ли создавать новый класс и DAO только с указанными полями c? Или, может быть, просто класс, поскольку таблица не указана c только для этих полей. Ошибка:

ошибка: столбцы, возвращаемые запросом, не имеют полей [commentID, questionID, quoteID, termID, topicID, удален] в com.mistywillow.researchdb.database.entities. Примечания, даже если они аннотированы как ненулевые или примитивные. Столбцы, возвращаемые запросом: [NoteID, SourceID, SourceType, Title, Summary] Список getNotesOnTopi c (строка topi c);

@Query("SELECT n.NoteID, s.SourceID, s.SourceType, s.Title, c.Summary FROM Comments as c " +
        "LEFT JOIN Notes as n ON n.CommentID = c.CommentID " +
        "LEFT JOIN Sources as s ON n.SourceID = s.SourceID " +
        "LEFT JOIN Topics as t ON n.TopicID = t.TopicID WHERE t.Topic = :topic AND n.Deleted = 0")
List<Notes> getNotesOnTopic(String topic);

Что я пытаюсь : я пытаюсь преобразовать существующее настольное приложение Java со встроенной базой данных SQLite. Приведенный выше запрос прекрасно работает в этом приложении. Я только хочу передать полевые данные из этих таблиц.

Что я пробовал : я немного погуглил и посетил некоторые форумы за последние несколько дней (например, Android Forum , Developer. Android .com), но большинство примеров Room @Query представляют собой полные запросы к одной таблице (например, «Выбрать * из таблицы»). Ничто из того, что я обнаружил (возможно, что-то есть), не касается, как и что делать, если вы объединяете и запрашиваете только определенные c поля в таблицах.

1 Ответ

0 голосов
/ 14 января 2020

Думаю, я исправил свою проблему. Я только что создал новый класс с именем SourceTable и обозначил запрашиваемые поля в конструкторе. Единственная проблема была в том, что я, согласно ошибке отслеживания, должен был соответствовать параметрам имен полей.

public class SourcesTable {
    private int NoteID;
    private int SourceID;
    private String SourceType;
    private String Title;
    private String Summary;

    public SourcesTable(int NoteID, int SourceID, String SourceType, String Title, String Summary){
        this.NoteID = NoteID;
        this.SourceID = SourceID;
        this.SourceType = SourceType;
        this.Title = Title;
        this.Summary = Summary;
    }
}

, а затем я обновляю свой метод списка:

List<SourcesTable> getNotesOnTopic(String topic);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...