如何使用ViewModel和LiveData高效查询Room数据库?

时间:2018-05-19 14:59:05

标签: android android-room android-viewmodel

编辑:我非常想问。

在SQLite中,我可以用我的查询创建一个光标:

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

我可以传递不同的列,searchClauses或selectionArgs来查找我想要的数据。

与Room Database相同的是什么?

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

我将如何做到这一点?

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

我将使用其中的listViews在我的应用程序中以各种片段(在同一活动中)显示此数据。

因此,我最初的方法是询问很多,但对Room的小查询,以便在需要的地方获取所需的数据。 但是,在使用ViewModel / LiveData架构时,我仍然坚持如何进行许多查询。

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

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

当我想制作一个显示颜色和平均值的列表时,我会使用它。以卖价为例。列表项可以有一个项(例如蓝色)或两个或多个颜色组合(黑色和黄色),这就是我需要使用String []的原因。 (我的应用不是关于鞋子/颜色我只是以此为例)..

要达到此查询,我必须设置 ViewModel with 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);
    }
}

}

然后我会在我的Activity或Fragment中查询数据。我必须将我想要查询的颜色的定义颜色[]传递给工厂。

 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所有这些查询?我不得不每次创建一个新工厂并创建几十个ViewModel来允许传递的每个参数类型和计数?或者这就像在SQLite中为每个查询创建一个新的Cursor?

基本上我不知道如何使用Room进行那么多查询。

我的另类想法:

而不是制作数百个小查询(如果我弄清楚如何做),我想我只需要查询数据库一次,并使用我的ViewModel查询getAllData。这会给我一个包含所有数据的列表。

从那里我可以在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;

               ...

        }

    }

然后,我可以通过相应适配器中的getter方法从Activity中获取这些列表,然后在那里进行进一步的操作?比如将平均鞋子尺寸或平均销售价格按颜色分开,然后将这些平均值显示在列表中?

基本上,当我在每个listView中只需要非常具体的数据时,我不确定如何将所有数据提取到多个列表视图中,而不是所有数据。

0 个答案:

没有答案