Как объединить несколько таблиц в Room Database - PullRequest
0 голосов
/ 14 января 2019

У меня есть абстрактный класс, подобный этому:

public abstract class NotificationParent {
  @SerializedName(SerCons.C_NOTIFICATION_ID) private int notificationId;
  @SerializedName(SerCons.C_ID) private int id;
  @SerializedName(SerCons.C_DATE) private long date;
  ...
}

и два класса, которые наследуются от упомянутого абстрактного класса:

public class NotifNewRingTone extends NotificationParent {
  @SerializedName(SerCons.C_GAME_ID) private int rtId;
  @SerializedName(SerCons.C_GAME_NAME) private String rtName;
..
}
public class NotifNewWallpaper extends NotificationParent {
  @SerializedName(SerCons.C_GAME_ID) private int wpId;
  @SerializedName(SerCons.C_GAME_NAME) private String wpName;
  ...
}

Я хочу сделать 3 таблицы в БД: notifications, wallpaper_notification, ringtone_notifications. Но когда я хочу выбрать (присоединиться) из таблиц, чтобы получить все уведомления (обои и рингтоны), я не знаю, что мне нужно делать.

Я хочу что-то вроде этого:

@Query("select * from notifications n left join ringtone_notifications r on n.notif_id = r.notif_id left join wallpaper_notifications w on n.notif_id = w.notif_id) public NotificationParent getAllNotifications();

Но это даст мне только те поля, которые содержит класс NotificationParent. Не поля подклассов. Также я хочу, чтобы запрос был готов к реализации архитектуры PagedList.

Пожалуйста, дайте ваши предложения, даже если я должен изменить дизайн классов.

1 Ответ

0 голосов
/ 18 января 2019

Ваш запрос выбора выглядит правильно. Но твой метод не верен.

public NotificationParent getAllNotifications();

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

public class MyObject {
    private int notificationId;
    private int id;
    private long date;
    private int rtId;
    private String rtName;
    private int wpId;
    private String wpName;
 }

И положи в нее все со своих столов. Если вы не хотите все, что вам нужно изменить вместо выбора * вы можете поставить

Select notifications.date, ringtone_notifications.rtName

Ваш объект будет таким:

public class MyObject {
        private long date;
        private String rtName;
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...