0

编辑:我本质上问的是什么。

在 SQLite 中,我可以像这样从我的查询中创建一个游标:

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

我可以在其中传递不同的列、searchClauses 或 selectionArgs 以通过查询查明我想要的数据。

房间数据库相当于什么?

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

我该怎么做呢?


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

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

因此,我最初的方法是对 Room 进行大量但很小的查询,以便在需要的地方获取所需的数据。但是,在使用 ViewModel/LiveData 架构时,我不知道如何进行这些查询。

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

@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);
    }
}

}

然后我会像这样查询我的 Activity 或 Fragment 中的数据。我必须将我定义的 colour[] 与我想查询的颜色一起传递给工厂。

 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
        }
    });

这是我的问题/问题所在:

如果我想为我的第一个列表项查询“蓝色”。我的第二个是 {"black","yellow"},然后是我的第三个列表项的其他颜色。每次都要新建一个工厂,然后在 ViewModel 上设置新工厂吗?a 我还能如何检索这些数据?这只是一个小例子:有时我想要平均。按鞋码列出的售价。有时我想按颜色查询最受欢迎的鞋码。

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

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

我的替代想法:

与其进行数百个小查询(如果我知道该怎么做的话),我想我只需查询一次数据库并使用我的 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;

               ...

        }

    }

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

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

4

0 回答 0