Наследование сущностей в комнате Android - PullRequest
2 голосов
/ 06 мая 2019

У меня есть родительский класс Очередь , который имеет следующие поля:

  1. Имя
  2. Тип
  3. Состояние

В зависимости от типа я разложил очередь на дополнительные подклассы, каждый из которых имеет свои дополнительные поля. Например:

ProductionQueue extends Queue { startDate, endDate }
ShippingQueue extends Queue { shippingDate, shippingAgent }
...

Я создал Queue как базовый класс в Android Studio и расширяю свои подклассы из него, но код не компилируется и жалуется на пропущенные поля (поля подкласса). Вот пример:

@Entity(tableName = "queue")
public class Queue {
  int id;
  String name;
  int type;
  int status;
}

@Entity
public class ProductionQueue extends Queue {
  String startDate;
  String endDate
}

@Dao
public interface ProductionQueueDao extends BaseDao<ProductionQueue> {
    @Query("SELECT * FROM queue WHERE id = :queueID")
    LiveData<List<ProductionQueue>> findByID(Long queueID);
}

При компиляции я получаю: error: Столбцы, возвращаемые запросом, не имеют полей [startDate, endDate] в com.example.room.ProductionQueue, даже если они аннотированы как ненулевые или примитивные. Столбцы, возвращаемые запросом: [идентификатор, имя, тип, статус].

[id,name,type,status] исходят из родительского класса, а [startDate, endDate] являются полями подкласса.

В разных случаях в моем приложении я только перечислял имена, тип и состояние очереди и предпочел бы хранить данные очереди в одной таблице для быстрого запроса.

Я могу создавать под-таблицы для отдельных подклассов и использовать отношения, но если Room позволяет наследовать, всего этого можно легко избежать. Поддерживает ли комната такое наследование, если да, как я могу заставить его работать?

Спасибо.

1 Ответ

1 голос
/ 06 мая 2019

Проблема заключается в том, что вы пытаетесь получить производственные очереди из таблицы queue, которая не содержит информацию о датах, необходимых для производственных очередей.

Чтобы решить эту проблему, определите имя длятаблица производственных очередей:

@Entity(tableName = "production_queue")
public class ProductionQueue extends Queue {
    ...
}

Затем измените запрос, чтобы получить строки из правильной таблицы:

// Retrieving rows from "production_queue", not from "queue"
@Query("SELECT * FROM production_queue WHERE id = :queueID")
LiveData<List<ProductionQueue>> findByID(Long queueID);

Таким образом, возвращаемые строки будут содержать поля startDate и endDate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...