是否有必要始终创建一个视图模型来执行简单的查询,或者我可以从我的存储库访问数据库吗?

Is it necessary to always create a viewmodel to perform a simple query or can I access the database from my repository?

我正在使用学生点名应用程序,我正在使用 Room 数据库:Dao、Repository、ViewModel,我有以下 tables:Group、Student、StudentGroup、AttendanceRecord、AttendanceStatus 等.

假设我今天要在 A 组上课。 所以我有一个 activity 来考勤,在这种情况下我需要使用几个数据库 tables:StudentGroup 以查看链接到该组的学生,AttendanceRecord 为今天的日期创建出勤记录, AttendanceStatus 用于保存今天每个学生的出勤状态(出席、缺席、请求许可等),Group 用于显示出勤组的名称。

在组 table 中,我唯一需要的数据是在屏幕上显示它的名称(组 ID 来自 getIntent().getExtras()),在这种情况下,我需要 GroupViewModel获取名称 String 还是我可以只使用我的存储库?

GroupRepo

public String getName(long idGroup){
    Callable<String> callable = () -> groupDao.getName(idGroup);
    String name = null;

    ExecutorService executorService = Executors.newSingleThreadExecutor();
    Future<String> future = executorService.submit(callable);
    try {
        name = future.get();
    } catch (InterruptedException e1) {
        e1.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
    return name;
}

组视图模型

private GrupoRepo groupRepo;
private LiveData<List<Group>> groupList;
private MutableLiveData<Integer> enableDisable = new MutableLiveData<Integer>();

public GrupoViewModel(@NonNull Application application) {
    super(application);
    groupRepo = new GroupRepo(application);
    enableDisable.setValue(MySettings.getMainView(application.getApplicationContext()));
    groupList = Transformations.switchMap(enableDisable,
            filter -> groupRepo.getFilteredGroups(filter));
}

public void setFilter(Integer enableDisable) {
    this.enableDisable.setValue(enableDisable);
}

public LiveData<List<Group>> getGroupList(){
    return groupList;
}

public String getName(long idGroup){
    return groupRepo.getName(idGroup);
}

如果我只需要组的名称,我认为直接从存储库中获取它更简单也更有用,如果我创建一个 GroupViewModel 的实例,一个我不需要的组列表这个 activity 将被初始化。这是正确的还是我误解了?

考虑到我上面提到的用途,我需要 table 在我的列表传递 activity 中实例化您的 ViewModel?

使用 ViewModel 的主要好处之一是它的设计寿命超过 UI 组件(Activity 和 Fragment)的生命周期,这意味着您不必担心配置更改后的数据。

LiveData 仅在其值更改时接收更新。因此,只有当您有 new/different 数据时,您 activity 中的观察者才会被触发。

您的 getName 函数正在使用执行器来执行某些数据库 I/O,您绝对不想在 activity 中直接调用它。我建议创建另一个 LiveData 字段来包含它并在 Activity 中观察它。您当然可以绕过 ViewModel,但是您会错过上面解释的好处。

如果您还没有阅读它们,最好的起点是:

此外,也是学习 Kotlin 的好时机,因为 coroutines 使此类代码更易于编写和维护。