是否有必要始终创建一个视图模型来执行简单的查询,或者我可以从我的存储库访问数据库吗?
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 使此类代码更易于编写和维护。
我正在使用学生点名应用程序,我正在使用 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 使此类代码更易于编写和维护。