SQLite插入数据时ID全部为0的技术问题求助
解决SQLite自增ID插入后数据库显示为0的问题
嘿,这个矛盾的情况我之前也碰到过——内存里的对象ID看起来正常,但数据库里全是0,核心问题肯定是你代码里设置的ID没真正写入数据库,或者插入时传了错误的0值。下面是几个最可能的原因和对应的解决办法:
1. 表结构的自增配置不对
先检查你的alimento表创建语句,SQLite的自增ID有严格要求:
- ID字段必须是
INTEGER PRIMARY KEY(注意是INTEGER,不是INT、BIGINT这些,SQLite对这个类型的识别很严格) - 如果需要严格递增不重用已删除的ID,可以加上
AUTOINCREMENT,但不加的话SQLite也会自动生成自增的ROWID映射到这个字段
举个错误的表结构例子:
CREATE TABLE alimento ( id INT PRIMARY KEY, -- 这里用INT就错了 nome TEXT, -- 其他字段... );
正确的写法应该是:
CREATE TABLE alimento ( id INTEGER PRIMARY KEY AUTOINCREMENT, -- 或者只写INTEGER PRIMARY KEY nome TEXT, -- 其他字段... );
2. 插入时手动传入了0作为ID值
大概率是你插入数据的时候,主动给id字段传了0(比如实体类里ID的默认值是0,插入时没跳过这个字段),哪怕表配置了自增,SQLite也会优先用你传入的0。
比如用JDBC的错误写法:
String insertSql = "INSERT INTO alimento (id, nome) VALUES (?, ?)"; PreparedStatement pstmt = conn.prepareStatement(insertSql); pstmt.setInt(1, alimento.getId()); // 这里getId()返回的是初始的0 pstmt.setString(2, alimento.getNome()); pstmt.executeUpdate();
然后你又手动给alimento.setId(id)设置了一个模拟的自增ID,导致内存里显示正常,但数据库里已经写入了0。
正确的做法是不要指定ID字段,让SQLite自动生成,然后把生成的ID取出来设置到对象里:
String insertSql = "INSERT INTO alimento (nome) VALUES (?)"; // 去掉id字段 // 加上Statement.RETURN_GENERATED_KEYS来获取自增ID PreparedStatement pstmt = conn.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS); pstmt.setString(1, alimento.getNome()); pstmt.executeUpdate(); // 获取数据库生成的真实ID ResultSet rs = pstmt.getGeneratedKeys(); if (rs.next()) { int realId = rs.getInt(1); alimento.setId(realId); // 这时候设置的ID才是数据库里真正的ID }
3. ORM框架的配置坑(如果用了Room/Hibernate这类)
如果你用了ORM框架,那可能是实体类的ID注解配置错了:
- 比如Room里,必须给ID字段加
@PrimaryKey(autoGenerate = true),而且不要给ID设置默认值0 - 如果实体类里ID默认是0,框架会把0当作有效值插入,不会触发自增
错误的Room实体类例子:
@Entity(tableName = "alimento") public class Alimento { @PrimaryKey private int id = 0; // 默认0会导致插入0 private String nome; // getter/setter... }
正确的配置:
@Entity(tableName = "alimento") public class Alimento { @PrimaryKey(autoGenerate = true) private int id; // 不要设默认值,或者用Integer类型设为null private String nome; // getter/setter... }
快速排查步骤
- 先查
alimento表的结构,确保ID是INTEGER PRIMARY KEY - 检查插入代码,确认没有手动传0到ID字段,而是让数据库自动生成
- 如果用ORM,检查实体类的ID注解,确保开启了自增且无默认0值
- 插入后一定要从数据库获取真实生成的ID,再设置到对象里,别自己模拟自增
内容的提问来源于stack exchange,提问作者Nelson Silva
相关产品推荐
相关产品推荐

