Parse无法删除捐赠请求对象问题求助(附实现代码)
无法删除Parse数据库中存在的捐赠请求对象
我正在开发的应用里有个取消捐赠请求的功能,希望用户取消时把对应的对象从数据库中删除,但现在完成不了删除操作。这个对象肯定在数据库里,因为操作前刚从请求页面打开它。以下是取消功能的代码:
public void cancel(View view){ new AlertDialog.Builder(this) .setTitle("Are you sure you want to cancel this request?") .setMessage("It is unchangeable") .setIcon(android.R.drawable.ic_dialog_alert) .setCancelable(true) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { ParseQuery<ParseObject> query = ParseQuery.getQuery("ArchivedRequests"); query.whereEqualTo("donorUsername", ParseUser.getCurrentUser().getUsername()); query.whereEqualTo("ngoUsername", ngoUsername); query.whereEqualTo("requestsDate", date); query.whereEqualTo("requestTime", time); query.findInBackground(new FindCallback<ParseObject>() { @Override public void done(List<ParseObject> objects, ParseException e) { if (e == null){ if (objects.size() > 0){ for (ParseObject object : objects){ object.deleteInBackground(); Toast.makeText(DateChangeActivity.this, "Inform your NGO that you have cancelled the request!", Toast.LENGTH_LONG).show(); Intent intent = new Intent(DateChangeActivity.this, DonorChatActivity.class); intent.putExtra("ngo", ngoUsername); intent.putExtra("ngoN", ngoName); intent.putExtra("class", "donor"); startActivity(intent); } } } } }); } }) .setNegativeButton("No", null) .show(); }
恳请告知如何修复该问题,提前感谢。
问题排查与修复方案
我帮你梳理几个优先级最高的问题点,一步步来解决:
1. 先补上异常排查逻辑,别让错误静默发生
你现在的代码只处理了查询成功的情况,但如果查询时出现网络问题、权限不足或者其他异常,你完全不知道问题出在哪。先把异常日志加上:
@Override public void done(List<ParseObject> objects, ParseException e) { if (e == null){ // 原有查询成功的逻辑 } else { // 打印错误日志,方便定位 Log.e("CancelRequest", "查询对象失败: " + e.getMessage()); Toast.makeText(DateChangeActivity.this, "取消失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } }
同时,在查询到空结果时也加个提示,确认是不是真的没匹配到对象:
if (objects.size() > 0){ Log.d("CancelRequest", "查到了" + objects.size() + "个匹配对象"); // 原有循环删除逻辑 } else { Log.d("CancelRequest", "没有找到匹配的请求对象"); Toast.makeText(DateChangeActivity.this, "未找到对应的捐赠请求", Toast.LENGTH_SHORT).show(); }
2. 最可能的原因:查询条件不匹配
你说对象肯定存在,但查询没找到,大概率是这几个细节出了问题:
- 日期/时间类型不匹配:如果数据库里的
requestsDate和requestTime是Parse的Date类型,但你传入的date/time是字符串,那绝对匹配不到。要确保变量类型和数据库字段类型完全一致。 - 字符串大小写或格式问题:比如数据库里的
donorUsername是小写,但ParseUser.getCurrentUser().getUsername()返回的是大写,或者ngoUsername带有空格/特殊字符,都可能导致匹配失败。 - 建议换更可靠的查询方式:如果这个捐赠请求有唯一的
objectId,直接用ParseQuery.getQuery("ArchivedRequests").getInBackground(objectId)来获取对象,比多条件匹配靠谱得多——多条件很容易因为细微的类型/值差异失效。
3. 修复异步删除+页面跳转的顺序问题
你现在在调用deleteInBackground()后立刻跳转页面,但删除是异步操作,有可能跳转时删除还没完成;而且如果查询到多个对象,你会多次触发页面跳转,这显然不符合业务逻辑。
应该把跳转逻辑放在删除完成的回调里:
for (ParseObject object : objects){ object.deleteInBackground(new DeleteCallback() { @Override public void done(ParseException e) { if (e == null) { // 只有删除成功后才提示并跳转 Toast.makeText(DateChangeActivity.this, "Inform your NGO that you have cancelled the request!", Toast.LENGTH_LONG).show(); Intent intent = new Intent(DateChangeActivity.this, DonorChatActivity.class); intent.putExtra("ngo", ngoUsername); intent.putExtra("ngoN", ngoName); intent.putExtra("class", "donor"); startActivity(intent); // 跳转后关闭当前页面,避免返回后重复操作 finish(); } else { Log.e("CancelRequest", "删除对象失败: " + e.getMessage()); Toast.makeText(DateChangeActivity.this, "取消失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } } }); // 按业务逻辑,应该只有一个匹配对象,所以可以直接break跳出循环 break; }
4. 检查Parse表的权限设置
确认你的ArchivedRequests表权限是否允许当前用户删除该对象。Parse默认权限是创建者可以删除,如果这个请求对象是其他用户创建的,当前用户没有权限的话,删除会静默失败。
内容的提问来源于stack exchange,提问作者l_b
相关产品推荐
相关产品推荐

