【发布时间】:2018-11-09 00:32:21
【问题描述】:
我有下一个用例:用户来到注册表,输入姓名、电子邮件和密码,然后单击注册按钮。在该系统需要检查电子邮件是否被接收并基于该显示错误消息或创建新用户之后......
我正在尝试使用 Room、ViewModel 和 LiveData 来做到这一点。这是我尝试学习这些组件的一些项目,我没有远程 api,我会将所有内容存储在本地数据库中
所以我有这些课程:
- 注册活动
- 注册ViewModel
- 用户
- UsersDAO
- 用户存储库
- UsersRegistrationService
所以我的想法是,注册按钮会附加一个监听器,它将调用RegisterViewModel::register() 方法。
class RegisterViewModel extends ViewModel {
//...
public void register() {
validationErrorMessage.setValue(null);
if(!validateInput())
return;
registrationService.performRegistration(name.get(), email.get(), password.get());
}
//...
}
这就是基本的想法,我也想让performRegistration返回给我新创建的用户。
最困扰我的是我不知道如何在服务中实现performRegistration功能
class UsersRegistrationService {
private UsersRepository usersRepo;
//...
public LiveData<RegistrationResponse<Parent>> performRegistration(String name, String email, String password) {
// 1. check if email exists using repository
// 2. if user exists return RegistrationResponse.error("Email is taken")
// 3. if user does not exists create new user and return RegistrationResponse(newUser)
}
}
据我了解,UsersRepository 中的方法应返回 LiveData,因为 UsersDAO 正在返回 LiveData
@Dao
abstract class UsersDAO {
@Query("SELECT * FROM users WHERE email = :email LIMIT 1")
abstract LiveData<User> getUserByEmail(String email);
}
class UsersRepository {
//...
public LiveData<User> findUserByEmail(String email) {
return this.usersDAO.getUserByEmail(email);
}
}
所以我的问题是如何实现performRegistration() 函数以及如何将值传递回视图模型,然后如何将活动从 RegisterActivity 更改为 MainActivity...
【问题讨论】:
-
那么
performRegistration基本上是一种插入方法?而且,并不是所有的 Dao 方法都应该返回LiveData -
是的,但它确实需要检查该电子邮件是否被接收
-
所以在插入之前你想查询数据库以检查电子邮件是否已经存在,对吧?
-
是的,但 DAO.getUserByEmail() 返回 LiveData
-
您应该查看架构组件指南developer.android.com/jetpack/docs/guide。在 UsersRegistrationService 类中,您需要一个 MediatorLivedata,您将作为源 LiveDatas 添加到每个注册用户的状态。
标签: android observer-pattern android-room android-architecture-components android-livedata