Как эффективно и часто делать запросы к базе данных Room с ViewModel и LiveData?

Редактировать: что я действительно спрашиваю.

В SQLite я мог бы создать курсор из моего запроса следующим образом:

 Cursor cursor = db.query(TABLE_NAME, columns, searchClause, selectionArgs, null, null, null);

Где я мог передать различные столбцы, searchClauses или selectionArgs, чтобы точно определить данные, которые я хочу с моим запросом.

Что эквивалентно этому с Room Database??

Редактировать 2: Кроме того, если я сделаю запрос в базу данных, я получу список со всеми элементами, хранящимися в базе данных. Оттуда я хочу создать другой список, который объединяет элементы в другой список. Например, если у меня есть три элемента синего цвета в базе данных, я хочу показать список элементов с элементом "синий", который также показывает среднее значение продажной цены для этих трех элементов. Таким образом, новый список будет состоять из всех цветовых элементов, объединенных в один элемент списка для каждого цвета, с соответствующими средними значениями в цене продажи.

Как бы я поступил так?


Итак, у меня есть довольно большая база данных с 50 столбцами для моего приложения. Большинство столбцов могут принимать различные значения, которые определяются пользовательским вводом.

Я буду отображать эти данные по всему приложению в разных фрагментах (в том же упражнении), используя в них listViews.

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

Например, в моем Дао это может быть запрос:

@Query("SELECT selling_price FROM table WHERE colour IN (:colours)")
LiveData<List<Shoe>> getColour(String[] colours);

Я хотел бы использовать это, когда я хочу сделать список, который показывает цвета и средние значения. цена продажи например. Элемент списка может содержать один элемент (например, синий) или два или более цветов (черный и желтый), поэтому мне нужно использовать строку []. (Мое приложение не об обуви / цветах, я просто использую это в качестве примера)..

Чтобы достичь этого запроса, мне нужно было бы настроить ViewModel с фабричной верностью? Вот так:

public class ArrayViewModel extends ViewModel {


private LiveData<List<Shoe>> colourList;
private final String[] mColours;

public ArrayViewModel(Database dataBase, String[] colours){

    mColours = colours;
    colourList = dataBase.shoeDao().getColours(actions);

}


public LiveData<List<Shoe>> getColours(){return colourList;}

public static class ArrayViewModelFactory extends ViewModelProvider.NewInstanceFactory {

    private final Database mDatabase;
    private final String [] mColours;

    public ArrayViewModelFactory(Database dataBase, String[] colours) {

        mDatabase = dataBase;
        this.mColours = colours;
    }


    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        return (T) new ArrayViewModel(mDatabase, mColours);
    }
}

}

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

 ArrayViewModel.ArrayViewModelFactory factory = new ArrayViewModel.ArrayViewModelFactory(database,color[])
    final ArrayViewModel viewModel = ViewModelProviders.of(this,factory).get(ArrayViewModel.class);
    viewModel.getColours().observe(this, new Observer<List<Shoe>>() {
        @Override
        public void onChanged(@Nullable List<Shoe> shoes) {
            //do stuff
        }
    });

Это была моя проблема / вопрос лжи:

Если я хочу запросить "синий" для моего первого элемента списка. И {"черный","желтый"} для моего второго, а затем и другие цвета для моего третьего элемента списка. Должен ли я каждый раз создавать новую фабрику, а затем устанавливать новую фабрику в ViewModel? а Как еще я могу получить эти данные? И это только маленький пример: иногда я хочу получить среднее значение. цена продажи указана по размеру обуви. Иногда я хочу запросить наиболее популярные размеры обуви по цвету.

Моя реальная база данных содержит 50 столбцов с множеством различных потенциальных запросов, которым требуется разное количество / тип передаваемых аргументов. Как я могу сделать все эти запросы, чтобы заполнить различные listViews/RecyclerViews с его помощью? Не может быть, чтобы мне приходилось каждый раз создавать новую фабрику и создавать десятки ViewModels, чтобы учесть каждый тип аргумента и количество передаваемых данных? Или это похоже на создание нового курсора для каждого запроса в SQLite?

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

Моя альтернативная идея:

Вместо того, чтобы делать сотни небольших запросов (если я выясню, как это сделать), я подумал, что просто сделаю запрос к базе данных один раз и получу AllData с моей ViewModel. Это дало бы мне список со всеми данными.

Оттуда я мог бы просто запустить / отфильтровать список в цикле for, чтобы найти то, что я хочу?

Например:

 for (int i = 0; i < allShoesList.size(); i++ ){

        Shoe shoe= allShoesList.get(i);

        String colour = hand.getColour();

        //make different lists according to Colour
        switch (colour){

            case "blue":              
                blueList.add(shoe);
                break;

            case "black":
                blackList.add(shoe);
                break;

               ...

        }

    }

Затем я мог бы получить эти списки из Activity с помощью методов-получателей в соответствующих адаптерах, а затем выполнить дальнейшие операции там? Как получить средний размер обуви или среднюю цену продажи, разделенную по цвету, и затем отобразить эти средние значения в списке?

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

0 ответов

Другие вопросы по тегам