最后主要弄清了房间持久性和数据绑定的工作原理,我遇到了下一个问题。
我正在尝试将用户注册到我的应用程序,我需要将通过将其角色插入数据库而创建的ID传递给主要活动。
Google文档说,您可以返回一个带有插入参数的long。当我尝试我的存储库中的asynctask时,该参数不能是原始的,也就是长的。
当存在用于登录的字符时,我可以很好地检索ID,但是当我尝试创建新字符时,我无法以相同的方式接收ID。就像这样:
viewModel.login(mEmail, mPassword).observe(Login.this,
new Observer<Character>() {
@Override
public void onChanged(@Nullable Character character) {
if (character == null) {
Toast.makeText(Login.this, "Email does not exist.", Toast.LENGTH_SHORT).show();
dbValid = false;
} else if (character.getEmail().equals(mEmail)
&& character.getPassword().equals(mPassword)) {
Toast.makeText(Login.this, "SUCCESS", Toast.LENGTH_SHORT).show();
Intent mainMenu = new Intent(Login.this, MainMenu.class);
id = character.getId();
mainMenu.putExtra("id", id);
startActivity(mainMenu);
dbValid = true;
} else if(character.getEmail().equals(mEmail)
|| character.getPassword().equals(mPassword)) {
Toast.makeText(Login.this, "Email or password is wrong.", Toast.LENGTH_SHORT).show();
dbValid = false;
}
}
});
我有一个扩展AsyncTask的类,在doInBackground中,我为该播放器创建了所有用户选择的新字符集,然后将该播放器插入数据库。每当我尝试在任何地方获取ID时,我都会为null或0。
viewModel.getByEmail(mEmail).observe(Register.this,
new Observer<Character>() {
@Override
public void onChanged(@Nullable Character character) {
if(character == null){
player = new Character();
player.setName(username);
player.setGender(gender);
player.setVillage(villageText);
player.setEmail(mEmail);
player.setPassword(mPassword);
dbValid = true;
viewModel.insert(player);
}else{
dbValid = false;
}
播放器和所有数据都正确插入,并且有一个ID号,但我无法立即访问它。 我尝试在后台调用整个插入,然后执行执行以尝试更新字符,然后设置另一个可观察的对象并使用getId()。 试过了
int id = viewModel.findByEmail(mEmail).getValue.getId();