用已经存在的电子邮件或用户名保存用户会导致ParseUser返回错误的值

时间:2019-04-22 02:58:13

标签: android authentication parse-platform parse-android-sdk

我有以下代码,允许用户更新其数据:

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
        }
    }
});

到目前为止,我发现解决此问题的唯一方法是卸载/重新安装该应用程序。是什么原因造成的?有什么好办法解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您应该在setUsername(newName)之前备份当前用户名。 如果发生异常,则有两个选择:

  • 通过ParseUser.getCurrentUser().fetch()获取用户对象(以将对象恢复到其先前的状态)
  • 将用户名重新设置为之前的值(您之前已经备份过)

为什么会这样? 因为当您调用用户对象的setUsername()时,您更改了对象的本地副本(但尚未与服务器同步),然后进行了save()的操作,保存操作失败本地副本仍然具有您在本地所做的最新更改