You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:02:40