如何为SQLite数据库表添加自增ID?应用崩溃问题求助
解决SQLite添加自增ID后的崩溃问题
首先,咱们得先把表的结构调整正确,包含自增ID字段。SQLite里的自增主键需要用INTEGER PRIMARY KEY AUTOINCREMENT来定义,这是让自增功能正常工作的核心。
1. 正确创建带自增ID的表
先把你的表初始化语句改成这样(假设原表名为student,新增id作为自增主键):
CREATE TABLE IF NOT EXISTS student ( id INTEGER PRIMARY KEY AUTOINCREMENT, cost TEXT, make TEXT, model TEXT, fname TEXT, lname TEXT );
这里把id放在第一个字段位置,作为自增主键,SQLite会自动帮你生成唯一的递增ID值。
2. 修复第56行的INSERT语句(解决崩溃)
原来的崩溃原因很明确:你新增了id字段后,INSERT语句里的值数量和表的列数不匹配了。有两种靠谱的修复方式,推荐第一种(更安全,能避免字段顺序变动带来的问题):
方式一:指定要插入的列名(推荐)
明确写出要插入的列(跳过id,因为SQLite会自动生成它的值):
db.execSQL("INSERT INTO student (cost, make, model, fname, lname) VALUES('"+cost.getText()+"','"+make.getText()+"','"+model.getText()+"','"+fname.getText()+ "','"+lname.getText()+"');");
方式二:给id传NULL值
如果不想指定列名,可以给id字段传NULL,SQLite会自动填充自增ID:
db.execSQL("INSERT INTO student VALUES(NULL,'"+cost.getText()+"','"+make.getText()+"','"+model.getText()+"','"+fname.getText()+ "','"+lname.getText()+"');");
⚠️ 额外建议:直接把用户输入拼接进SQL语句有SQL注入风险,最好用ContentValues来替代,写法更安全也更简洁:
ContentValues values = new ContentValues(); values.put("cost", cost.getText().toString()); values.put("make", make.getText().toString()); values.put("model", model.getText().toString()); values.put("fname", fname.getText().toString()); values.put("lname", lname.getText().toString()); db.insert("student", null, values);
3. 在View All时展示自增ID
当你查询所有数据时,要把id字段一起查出来,比如查询语句:
SELECT id, cost, make, model, fname, lname FROM student;
然后在遍历Cursor的时候,获取并展示id的值:
int idIndex = cursor.getColumnIndex("id"); long studentId = cursor.getLong(idIndex); // 把studentId展示到UI上,比如TextView或者列表项里
这样修改后,自增ID就能正常工作,INSERT语句不会再崩溃,同时View All功能也能正确展示ID了。
内容的提问来源于stack exchange,提问作者Tanner Tattini
相关产品推荐
相关产品推荐

