Редактировать: То, что я спрашиваю по существу.
В SQLite я мог бы создать курсор из моего запроса следующим образом:
Cursor cursor = db.query(TABLE_NAME, columns, searchClause, selectionArgs, null, null, null);
Где я могпередать разные столбцы, searchClauses или selectionArgs, чтобы точно указать данные, которые я хочу с моим запросом.
Что эквивалентно этому с базой данных комнат ??
Редактировать 2: Кроме того, если я сделаю запрос к базе данных, я получу список со всеми элементами, хранящимися вбаза данных.Оттуда я хочу создать другой список, который объединяет элементы в другой список.Например, если у меня есть три элемента синего цвета в базе данных, я хочу показать элемент списка с элементом «синий», который также показывает среднее значение цены продажи по этим трем элементам.Таким образом, новый список будет состоять из всех цветовых элементов, объединенных в один элемент списка для каждого цвета, с соответствующими средними значениями в цене продажи.
Как бы я поступил так?
Итак, у меня довольно большая база данных с 50 столбцами для моего приложения.Большинство столбцов могут принимать различные значения, которые определяются пользовательским вводом.
Я буду отображать эти данные по всему моему приложению в различных фрагментах (в том же упражнении), используя в них listViews.
Таким образом, мой первоначальный подход состоял в том, чтобы просить большие, но небольшие запросы Room, получить нужные мне данные там, где они мне нужны.Тем не менее, я застрял в том, как сделать многие из этих запросов при использовании архитектуры ViewModel / LiveData.
Например, в моем дао это может быть запрос:
@Query("SELECT selling_price FROM table WHERE colour IN (:colours)")
LiveData<List<Shoe>> getColour(String[] colours);
Я бы использовал это, когда хочу составить список, который показывает цвета и средние значения.цена продажи например.Элемент списка может иметь один элемент (например, синий) или два или более цветов (черный и желтый), поэтому мне нужно использовать строку [].(Мое приложение не об обуви / цветах, я просто использую это в качестве примера) ..
Чтобы выполнить этот запрос, мне нужно настроить ViewModel с правом Factory ?Примерно так:
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.
Моя альтернативная идея:
Вместо сотен маленьких запросов (если я выясню, как это сделать), я подумал, что просто сделаю запрос к базе данных один раз иgetAllData с моей 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 с помощью методов getter в соответствующих адаптерах, а затем выполнить там другие операции?Как получить средний размер обуви или среднюю цену продажи, разделенную по цвету, и затем отобразить эти средние значения в списке?
По сути, я не уверен, как подходить к извлечению всех этих данных в несколько представлений списка, когда мне нужны только очень специфические данные в каждом listView, а не все данные.