android - 使用已存在的电子邮件或用户名保存用户会导致 ParseUser 返回错误的值
问题描述
我有以下代码允许用户更新他们的数据:
String username = "Any username that is currently already used by another user";
ParseUser currentUser = ParseUser.getCurrentUser();
if (currentUser != null) {
currentUser.setUsername(username);
currentUser.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
// All good!
} else {
// Error: Account already exists for this username.
Log.e("Error: ", e.getMessage());
}
}
}
});
当用户尝试使用其他人已使用的用户名更新用户名时,会引发错误:
此用户名的帐户已存在。
这正是我想要的,但是当用户返回时(没有再次请求将用户名更改为可用的用户名),ParseUser.get("username")
返回未保存的值,因为它已经存在(而不是真实的当前存储在服务器中的值)。
ParseUser currentUser = ParseUser.getCurrentUser();
currentUser.fetchInBackground(new GetCallback<ParseUser>() {
public void done(ParseUser user, ParseException exception) {
if (exception == null) {
// username now returns ("Any username that is currently already used by another user").
String username = user.get("username").toString().trim();
} else {
// Error
}
}
});
到目前为止,我发现解决此问题的唯一方法是卸载/重新安装该应用程序。这是什么原因造成的?有什么好的方法可以解决这个问题吗?
解决方案
您应该在之前备份当前用户名setUsername(newName)
。如果发生异常,您有两种选择:
- 重新获取用户对象
ParseUser.getCurrentUser().fetch()
(将对象恢复到他之前的状态) - 将用户名重新设置为以前的值(您之前已经备份过)
为什么会这样?因为当您调用setUsername()
用户对象时,您更改了对象的本地副本(但您尚未将其与服务器同步),然后当您进行save()
保存操作失败时,本地副本仍然具有您的最新更改本地制作
推荐阅读
- python - 数据帧的真值只有在通过 Tkinter 运行时才模棱两可
- python - 事件网格使用 blob 存储输入和输出 Python 触发 Azure Functions
- swagger - Docebo web api 是否支持 Swagger?
- javascript - img-wrapper 不显示 png
- javascript - 未处理的承诺拒绝 | 重启命令
- asp.net-core - Azure DevOps:“rzc generate exited with code 2”
- java - 如何解决本地计算机上的 Tomcat 问题
- raku - 从 Raku HTTP 客户端请求中提取 JSON
- angular - 角度材料文本区域无法按预期工作
- json - 带有 JSON 嵌套对象的 Powershell - 无法获取对象属性的属性