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参数在方法内部没有被使用,完全是无效参数,不会对结果产生任何影响。
解决方案
- 先实现数据库写入逻辑,将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(); }
- 统一主键列名
将建表语句的主键列名和查询条件的列名对齐,比如将建表语句改成:
String create_table = "CREATE TABLE " + TABLE_NAME + "( " + "_ID INTEGER PRIMARY KEY ," + VALUE + " TEXT NOT NULL, " + STATUS + " INTEGER NOT NULL)";
或者将查询语句的WHERE条件改成ID = ?,保证列名一致。
触发表结构更新
修改SQLiteOpenHelper构造方法传入的版本号,比之前的版本号+1,或者直接卸载重装APP,让新的建表语句生效,保证STATUS列的NOT NULL约束生效。优化冗余逻辑
删除getStatus方法中没用的status参数,避免后续逻辑混淆。
内容的提问来源于stack exchange,提问作者m umer
相关产品推荐
相关产品推荐

