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

Android SQLite存储布尔值时status列始终返回0问题求解

问题原因
  • 核心问题是你没有执行任何数据库写入操作:你仅在代码中将status变量赋值为1,完全没有将这个值写入到SQLite的对应行中,查询时自然拿不到更新后的值。
  • 主键列名不匹配:建表语句中你定义的主键列名为ID,但查询语句中使用的是_ID变量作为查询条件,如果_ID的值为"_id",会导致查询条件匹配不到任何行,触发cursor.moveToFirst()返回false,直接走else分支返回固定值0。
  • 表结构未生效:你建表时声明STATUS列是INTEGER NOT NULL,但实际数据库中该列全为NULL,说明你修改建表语句后没有升级SQLiteOpenHelper的版本号,APP仍在使用旧的表结构,旧结构中STATUS列要么不存在,要么没有NOT NULL约束。
  • getStatus方法逻辑冗余:你传入的status参数在方法内部没有被使用,完全是无效参数,不会对结果产生任何影响。
解决方案
  1. 先实现数据库写入逻辑,将status值更新到对应行后再执行查询
    示例更新方法:
// 新增更新status的方法
public void updateStatus(String _id, int status) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(STATUS, status);
    db.update(TABLE_NAME, values, "ID = ?", new String[]{_id});
    db.close();
}

修改你的业务逻辑代码:

if (success) {
    status = 1;
    // 先写入数据库
    db.updateStatus(fetchId(), status);
    // 再执行查询
    int item_status = db.getStatus(fetchId(),status);
    Toast.makeText(this, " item_status " + item_status , Toast.LENGTH_SHORT).show();                                       
}
  1. 统一主键列名
    将建表语句的主键列名和查询条件的列名对齐,比如将建表语句改成:
String create_table = "CREATE TABLE " + TABLE_NAME + "( "
        + "_ID INTEGER PRIMARY KEY ,"
        +  VALUE + " TEXT NOT NULL, "
        +  STATUS + " INTEGER NOT NULL)";

或者将查询语句的WHERE条件改成ID = ?,保证列名一致。

  1. 触发表结构更新
    修改SQLiteOpenHelper构造方法传入的版本号,比之前的版本号+1,或者直接卸载重装APP,让新的建表语句生效,保证STATUS列的NOT NULL约束生效。

  2. 优化冗余逻辑
    删除getStatus方法中没用的status参数,避免后续逻辑混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:24:07