Android 如何使用ViewModel和LiveData高效且经常地查询房间数据库?

Android 如何使用ViewModel和LiveData高效且经常地查询房间数据库?,android,android-room,android-viewmodel,Android,Android Room,Android Viewmodel,编辑:我的基本要求 在SQLite中,我可以从查询中创建一个游标,如下所示: Cursor cursor = db.query(TABLE_NAME, columns, searchClause, selectionArgs, null, null, null); 在这里,我可以传递不同的列、search子句或selectionArgs,以精确定位查询所需的数据 房间数据库的等效功能是什么 编辑2:此外,如果我查询数据库,我将收到一个包含数据库中存储的所有项目的列表。从那里我想创建另一个列表

编辑:我的基本要求

在SQLite中,我可以从查询中创建一个游标,如下所示:

 Cursor cursor = db.query(TABLE_NAME, columns, searchClause, selectionArgs, null, null, null);
在这里,我可以传递不同的列、search子句或selectionArgs,以精确定位查询所需的数据

房间数据库的等效功能是什么

编辑2:此外,如果我查询数据库,我将收到一个包含数据库中存储的所有项目的列表。从那里我想创建另一个列表,将项目合并到另一个列表中。例如,如果数据库中有三个蓝色项目,我想显示一个带有项目“蓝色”的列表项目,该项目还显示这三个项目的平均售价。因此,新的清单将包括所有颜色的项目,合并为每种颜色的一个清单项目,以及它们各自的平均售价

我该怎么做呢


好的,我的应用程序有一个相当大的数据库,有50列。大多数列可以接受用户输入定义的各种值

我将在我的应用程序中使用ListView以不同的片段(在同一活动中)显示这些数据

所以我最初的方法是问很多问题,但只是问一些小问题,以便在我需要的地方得到我需要的数据。 但是,在使用ViewModel/LiveData体系结构时,我一直在研究如何进行这些查询

例如,在我的Dao中,这可能是一个查询:

@Query("SELECT selling_price FROM table WHERE colour IN (:colours)")
LiveData<List<Shoe>> getColour(String[] colours);
@Query(“从颜色所在的表中选择售价(:colors)”)
LiveData GetColor(字符串[]颜色);
例如,当我想制作一个显示颜色和平均售价的列表时,我会使用这个选项。列表项可以有一个项(例如蓝色),也可以有两个或多个颜色组合(黑色和黄色),因此我需要使用字符串[]。(我的应用程序不是关于鞋子/颜色的,我只是举个例子)

要进行此查询,我必须使用工厂设置一个视图模型,对吗? 像这样:

公共类ArrayViewModel扩展了ViewModel{
私有实时数据列表;
私有最终字符串[]mColours;
公共ArrayViewModel(数据库,字符串[]颜色){
M颜色=颜色;
colorlist=dataBase.shoeDao().getcolors(操作);
}
public LiveData getcolors(){return colorlist;}
公共静态类ArrayViewModelFactory扩展了ViewModelProvider.NewInstanceFactory{
私有最终数据库mDatabase;
私有最终字符串[]mColours;
公共ArrayViewModelFactory(数据库,字符串[]颜色){
mDatabase=数据库;
this.mColours=颜色;
}
@非空
@凌驾
公共T创建(@NonNull类modelClass){
return(T)新的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
        }
    });
ArrayViewModel.ArrayViewModelFactory=new ArrayViewModel.ArrayViewModelFactory(数据库,颜色[])
final ArrayViewModel viewModel=ViewModelProviders.of(this,factory.get)(ArrayViewModel.class);
viewModel.getcolors().observe(这个,新的观察者(){
@凌驾
更改后的公共void(@Nullable List){
//做事
}
});
这是我的问题
谎言:

如果我想为我的第一个列表项查询“蓝色”。第二个列表项是{“黑色”、“黄色”},第三个列表项是其他颜色。是否每次都必须创建一个新工厂,然后在ViewModel上设置新工厂? A. 我还能如何检索这些数据?这只是一个很小的例子:有时候我想按鞋码列出平均售价。有时我想按颜色查询最流行的鞋码

我的真实数据库有50列,其中包含大量不同的潜在查询,这些查询都需要传递不同数量/类型的参数。如何使用它来生成所有这些查询以填充不同的ListView/RecyclerViews?不可能每次我都要创建一个新工厂,并创建几十个ViewModels,以允许传递的每个参数类型和计数?或者这就像在SQLite中为每个查询创建一个新的游标

基本上,我不知道如何在房间里提出这么多问题

我的另一个想法:

我想我只需要查询一次数据库,然后用我的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;

               ...

        }

    }
for(int i=0;i
然后我可以通过相应适配器中的getter方法从活动中获取这些列表,然后在那里执行进一步的操作?比如用颜色分隔平均鞋码或平均售价,然后在列表中显示这些平均值


基本上,我不知道如何将所有这些数据提取到多个列表视图中,而我只需要每个列表视图中非常具体的数据,而不是所有的数据。

你能用一句话总结一下你想做什么吗?通过大量的小查询从房间数据库中提取数据。查询可能有很多参数要传入。我需要为每个查询创建一个新的ViewModel工厂吗?我在顶部进行了编辑以显示
 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;

               ...

        }

    }