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

数据库删除数据异常求助:收藏电影切换按钮功能故障

解决数据库删除数据的Toggle按钮问题

首先看你给出的代码片段,删除数据的部分明显有问题——delete方法的参数用错了,这应该是导致删除失败的核心原因。

问题分析

你现在的删除代码是:

favDb.delete(FavoriteContract.FavoriteEntry.TABLE_NAME, FavoriteContract.FavoriteEntry.COLUMN_ID, null);

Android的SQLiteDatabase.delete()方法参数逻辑是这样的:

  1. 第一个参数是目标表名
  2. 第二个参数是带占位符?的WHERE条件语句(不用写WHERE关键字)
  3. 第三个参数是对应占位符的具体值数组

你现在只写了列名COLUMN_ID作为第二个参数,这相当于执行了DELETE FROM table WHERE COLUMN_ID,这是完全无效的SQL语句——既没指定要匹配的具体ID值,第三个参数传null也没提供对应的值,数据库根本不知道要删哪条数据。

另外,你代码里创建了ContentValues cv但没在添加收藏时用上,这也是个小疏漏,添加数据时需要把电影信息存入cv再插入数据库。

修正后的完整toggleFav方法

// 收藏电影数据库中添加或移除电影的方法
public long toggleFav(MovieData movieData) {
    boolean isFavorite = isFav(movieData.getTitle());
    long result = -1; // 默认返回-1表示操作失败

    if (isFavorite) {
        // 如果已收藏,执行删除操作
        String selection = FavoriteContract.FavoriteEntry.COLUMN_ID + " = ?";
        // 用电影的唯一ID作为匹配条件,假设MovieData有getId()方法
        String[] selectionArgs = {String.valueOf(movieData.getId())};
        result = favDb.delete(
            FavoriteContract.FavoriteEntry.TABLE_NAME,
            selection,
            selectionArgs
        );
    } else {
        // 如果未收藏,执行添加操作
        ContentValues cv = new ContentValues();
        cv.put(FavoriteContract.FavoriteEntry.COLUMN_ID, movieData.getId());
        cv.put(FavoriteContract.FavoriteEntry.COLUMN_TITLE, movieData.getTitle());
        // 按需添加其他字段,比如海报路径、评分、上映日期等
        result = favDb.insert(FavoriteContract.FavoriteEntry.TABLE_NAME, null, cv);
    }
    return result;
}

额外注意事项

  • 确保你的isFav方法能正确判断电影是否已存在,比如通过标题或唯一ID查询:
    private boolean isFav(String title) {
        Cursor cursor = favDb.query(
            FavoriteContract.FavoriteEntry.TABLE_NAME,
            new String[]{FavoriteContract.FavoriteEntry.COLUMN_ID},
            FavoriteContract.FavoriteEntry.COLUMN_TITLE + " = ?",
            new String[]{title},
            null, null, null
        );
        boolean exists = cursor.getCount() > 0;
        cursor.close(); // 务必关闭Cursor,避免内存泄漏
        return exists;
    }
    
  • 操作数据库后记得同步更新UI(比如切换按钮的图标/文字),可以在调用toggleFav后直接刷新按钮状态,或者用ContentObserver监听数据库变化。
  • 数据库操作尽量放在子线程执行,避免阻塞主线程导致ANR(应用无响应)。

内容的提问来源于stack exchange,提问作者Ivan Bumbak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:07:04