Как эффективно и часто делать запросы к базе данных 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, а не все данные.