Комната - Как правильно / эффективно сделать запрос, который требует данных из другой таблицы для выполнения - PullRequest
0 голосов
/ 08 февраля 2020

Контекст

В приложении, которое я создаю, в моей базе данных есть две таблицы: - первая заполнена ПОЛЬЗОВАТЕЛЯМИ :

@Entity(tableName = "table_User")
public class User {

@PrimaryKey (autoGenerate = true)
private int id = 0;

@ColumnInfo(name = "firstName")
private String firstName;

@ColumnInfo(name = "lastName")
private String lastName;

@ColumnInfo(name = "soprannome")
@NonNull
private String soprannome;
  • во втором мне нужно сохранить пары пользователей (с разбивкой по дням), которые я сохраняю ID ПОЛЬЗОВАТЕЛЕЙ :
   @Entity(tableName = "table_Couple")
   public class Couple {

   @ColumnInfo(name = "user_1")
   private Integer id_user_1;

   @ColumnInfo(name = "user_2")
   private Integer id_user_2;

   @ColumnInfo(name = "day")
   private int day;

   @PrimaryKey (autoGenerate = true)
   private Integer id;

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

Моя конкретная проблема

Мне нужно получить Список из ПОЛЬЗОВАТЕЛЕЙ , которые появляются в ПАРАХ , которые имеют тот же ДЕНЬ , и поместить его в RecyclerView , чтобы показать их. Я нашел решение, которое меня не устраивает, потому что даже при небольшом объеме данных он медленный и неаккуратный.

   private List<Couple> CoupleList;

   mViewModel = new ViewModelProvider(this).get(ViewModel.class);

    //Here we make the call to get all the couple **ON THE MAIN THREAD, WITHOUT USING LIVEDATA**
    couplesList = mWordViewModel.getCouplesByDay(fragmentDayId); 

    //Parsing from *list* of *COUPLES* to *list* of *INT*
    List<Integer> CouplesListParsed = new ArrayList<Integer>();
    for (Couple eq : CouplesList){
        couplesListParsed.add(eq.getId_user_1());
        couplesListParsed.add(eq.getId_user_2());
    }

    // Add an observer on the LiveData
    mWordViewModel.getUsersById(CoupleListParsed).observe(this, new Observer<List<Users>>() {
        @Override
        public void onChanged(@Nullable final List<User> users) {
            // Update the cached copy of the users in the adapter.
            adapter.setWords(users);
        }
    });

Вызванные методы:

    public List<Equipaggio> getCouplesByDay( Integer dayId) { return mRepository.getCouplesByDay(dayId); }


    public LiveData<List<Allievo>> getUsersById(List<Integer> id) { return mRepository.getUsersById(id); }

Я почти уверен, что мои проблемы связаны с запросом к базе данных getEquipaggiByDay в главном потоке, но я не могу понять, как это исправить, поскольку создание LiveData, похоже, не делает смысл и вызов новой темы на самом деле не кажутся мне решением.

Актуальный вопрос

Так что, возможно, моя проблема может быть сведена к: Как правильно / эффективно составить запрос, для выполнения которого нужны данные из другой таблицы

Это мой первый вопрос, так что go просто для меня, и если в коде, о котором я сообщил, чего-то не хватает, не стесняйтесь указывать это из. Кроме того, я начал опасаться, что может быть какая-то большая проблема с архитектурой или плохая практика в действии, не стесняйтесь указывать на это тоже.

1 Ответ

0 голосов
/ 09 февраля 2020

Итак, благодаря ответу Павла, я получил лучший результат, которого я достиг благодаря этому запросу:

    @Query("SELECT DISTINCT * " +
        "FROM table_users AS al INNER JOIN table_couples AS eq" +
        " ON al.userId=eq.user_1 OR al.userId=eq.user_2" +
        " WHERE day=:dayId")
    LiveData<List<Allievo>> getUsersByCouplesByDay(Integer dayId) ;

Чтобы выполнить этот запрос, я изменил классы, добавив необходимые внешние ключи и индексы.

...