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

安卓端SQLite如何更新表中已有列的值?项目中操作不生效如何解决?

问题原因&修复方案

1. 核心错误:更新匹配条件完全错误

你调用updatedata时传入了要匹配的行主键id,但实际更新逻辑里完全没有使用这个参数,当前的更新语句:

long r = db.update("Library_Student",contentValues,"books=?",new String[]{books});

你用了books=?作为匹配条件,等于要找当前books字段值等于你要写入的新值的行来更新,要么完全找不到匹配行,要么更新的根本不是你要改的_id对应的那一行。
应该把匹配条件改成按主键_id匹配:

long r = db.update("Library_Student",contentValues,Lib_student._ID + "=?",new String[]{id});

2. 返回值判断逻辑错误

SQLiteDatabase.update()的返回值是受影响的行数,不是-1代表失败:

  • 匹配到行且更新成功:返回匹配到的行数(≥1)
  • 没有匹配到符合条件的行:返回0
  • 只有执行出错才会抛异常,不会返回-1
    你当前判断r == -1返回false,就算没有更新到任何行(返回0)也会返回true,所以你误以为操作成功了实际根本没有更新数据。
    正确的判断逻辑:
return r > 0;

3. 数据类型不匹配隐患

建表语句里COLUMN_STUDENT_BOOKS定义的是INTEGER类型,你现在ContentValues里put的是String类型的值,虽然SQLite有类型亲和性会自动转换,但建议统一类型避免隐性问题:

// 把传入的字符串转成整型再存入
contentValues.put(Lib_student.COLUMN_STUDENT_BOOKS, Integer.parseInt(books));

4. 冗余代码问题

你代码里执行了rawQuery查询得到的Cursor完全没有使用,而且没有调用cursor.close()关闭,会造成内存泄漏,直接删除这段无用查询即可。


修复后的完整方法代码

public boolean updatedata(String id,String books){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    // 类型匹配,转整型存入
    contentValues.put(Lib_student.COLUMN_STUDENT_BOOKS, Integer.parseInt(books));
    // 按主键_id匹配要更新的行
    long r = db.update("Library_Student",contentValues,Lib_student._ID + "=?",new String[]{id});
    // 正确判断更新结果
    return r > 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:54:04