这个问题,困扰了我几天,我曾一时苦苦无助.
眼看项目就到最后关头了,遇上这种难以解决的bug,几乎都快放弃.大不了就自己写个后端嘛,反正自己也搞过一段时间的后端,也完成了一个项目.不过都快要做完了,又另辟蹊径,这不符合我的性格.
所以我决定还是继续.
我又开了一个新的项目Project,就针对 用户更新这块 探索一下,看有没有新的发现.最终证实我的想法, 还是有的.
首先简单介绍问题的背景: 很简单,就是 用户个人信息的修改.比如更改用户名性别,年级等.本来还好好的,但是当做完修改用户名时, 结果用户名没有修改就提交了.导致后面更改任何信息都提示:
username ''xxxx" already taken,202
我真的试过很多办法, 比如修改 Bmob data sdk版本,但还是无效.这个错误一直霸屏几天.问了官方人员,但于事无补.
今天晚上,我就做了如下工作:
抽出来一些代码,自己调试.
首先要登录上去:
/**
* 用户登录,通过账号密码
* @param username
* @param passwd
*/
public void signIn(String username, String passwd){
User user = new User();
user.setUsername(username);
user.setPassword(passwd);
user.login(new SaveListener<User>() {
@Override
public void done(User user, BmobException e) {
if(e == null){
listener.LoginSuccess();
}else{
listener.LoginFailed(e);
}
}
});
}
然后弄了一个简单的按钮,当点击按钮时就 登录/修改用户信息.
登录成功后(以账号123登录),打印用户信息:
----user name---123---user sex----null----user mobile---18666551735-----user- grade----null
user.class
private String avatar;
private Grade grade;
private Sex sex;
private String sign;
private Address address;
private String nickname;
然后我试着更新:
user.setSign("1231312");
user.setUsername("123");
user.setAddress(null);
user.setGrade(null);
user.setSex(null);
user.update(new UpdateListener() {
@Override
public void done(BmobException e) {
if(e == null){
Toast.makeText(MainActivity.this,"修改成功",Toast.LENGTH_SHORT).show();
}else{
Log.d(TAG,"-----------UpdateListener-------------"+e.getMessage()+e.getErrorCode());
}
}
});
注意这时我setUsername依然是原来的用户名,这时提示用户名已存在
.
这时我意识到,一次setusername,就已经更改了本地缓存用户对象了.当然其它的set属性也是如此.
----user name---123---user sex----null----user mobile---18666551735-----user- grade----null------user sign------你好啊
----user name---1234---user sex----null----user mobile---18666551735-----user- grade----null------user sign------你好啊
-----------UpdateListener-------------username '1234' already taken.202
出现上面的错误,操作是这样的:
(1)首先bmob云的用户名是123,本地的也是123.
(2)这是我把setusename(“1234”),更改成功,Bmob云的用户名改为1234,本地的当然也是1234.
(3)第二次还是setusername(“1234”),则提示username ‘1234’,already taken.
然后就出现一个状态: 你想更改任何信息都不行!
这时要想更改其它信息,只要 先setUsername(null),就没有问题了.
所以最好是 不要出现setusername 的用户名和Bmob云上的一样!
否则以后更改任何信息都不行.
当然出现了这个情况,可以使用setusername(null).表示提交更新的用户的用户名未更改.然后其他地方调用update就不会报错了.
总算是解决了