我有以下使用案例:用户进入注册表单,输入姓名、电子邮件和密码,然后点击注册按钮。之后系统需要检查电子邮件是否被占用,根据结果显示错误信息或创建新用户...
我正在尝试使用Room、ViewModel和LiveData来完成这个任务。这是一个我尝试学习这些组件的项目,我没有远程API,我将把所有内容存储在本地数据库中。
因此,我有以下类:
- RegisterActivity
- RegisterViewModel
- User
- UsersDAO
- UsersRepository
- 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
。 - Suleyman