Back4App如何正确更新关系数据数组?关联未保存ParseObject报错怎么解决
错误原因
- 你调用的
temp.saveInBackground()是异步执行方法,代码不会等待Review对象保存完成再往下执行。在Review还未完成服务端持久化、没有生成唯一objectId时,就将它添加到Post的关系字段并触发Post保存,就会抛出该异常。 - 额外代码问题:你使用
ratingBar.getNumStars()获取的是评分条的总星数配置,不是用户实际选择的评分值,需要替换为ratingBar.getRating()。
正确实现代码
只需要修改submit点击事件中的else分支逻辑,将关联Post、保存Post、页面跳转的逻辑全部放到Review保存成功的回调中即可:
// 原有判断逻辑不变 }else{ ParseObject temp = ParseObject.create("Reviews"); temp.put("Description",description.getText().toString()); temp.put("author", ParseUser.getCurrentUser()); temp.put("likesCount",0); temp.put("dislikesCount",0); // 修复:获取用户实际选择的评分 temp.put("rating", ratingBar.getRating()); ParseRelation<ParseObject> relation = loadpost.getRelation("Reviews"); temp.saveInBackground(new SaveCallback() { @Override public void done(ParseException e) { // 先判断Review保存是否成功 if(e != null){ Log.e("ReviewFragment","保存Review失败", e); Toast.makeText(getContext(), "评论保存失败,请重试", Toast.LENGTH_SHORT).show(); return; } // Review保存成功后,再添加到Post的关系中 relation.add(temp); // 保存Post loadpost.saveInBackground(new SaveCallback() { @Override public void done(ParseException e) { if(e!=null){ Log.e("ReviewFragment","更新Post关系失败", e); Toast.makeText(getContext(), "保存失败,请重试", Toast.LENGTH_SHORT).show(); return; } // Post保存成功后再跳转页面 Homefragment nextFrag= new Homefragment(); getActivity().getSupportFragmentManager().beginTransaction() .replace(R.id.flContainer, nextFrag) .addToBackStack(null) .commit(); } }); } }); }
内容的提问来源于stack exchange,提问作者Qizong Liang
相关产品推荐
相关产品推荐

