Android SQLite插入数据时db.insert返回-1问题求助
首先先打消你的一个顾虑:ContentValues里的键值对显示顺序混乱不是问题。ContentValues内部是基于HashMap实现的,HashMap的遍历顺序是无序的,所以调试时看到Prayer=please Name=chris Email=chris@gmail.com Phone=123456这种顺序完全正常,数据库插入时会根据键名(比如Name、Email)去匹配表对应的字段,和显示顺序无关,这不是导致db.insert()返回-1的原因。
接下来我们重点排查插入失败的真正原因,结合你的代码,我整理了几个常见的排查方向和修复方案:
1. 字段名大小写不匹配(最可能的原因)
看你的代码:
- 在
DatabaseHelper的onCreate方法里,创建表的SQL语句用的是大写字段名:NAME TEXT, EMAIL VARCHAR, PHONE VARCHAR, PRAYER VARCHAR - 但你定义的常量
COL2 = "Name"、COL3="Email"等是首字母大写的驼峰命名
虽然SQLite默认对字段名大小写不敏感,但在某些场景下(比如数据库配置了区分大小写),会导致键名和字段名不匹配,插入失败。
修复方案:统一字段名的大小写,比如把常量改为和建表语句一致的大写:
// 修改DatabaseHelper里的常量定义 public static final String COL2 = "NAME"; public static final String COL3 = "EMAIL"; public static final String COL4 = "PHONE"; public static final String COL5 = "PRAYER";
或者反过来,修改建表语句的字段名为驼峰命名,和常量保持一致:
String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " + "Name TEXT, Email VARCHAR, Phone VARCHAR, Prayer VARCHAR )";
2. 检查表是否正确创建
如果你的App之前已经安装过,旧的数据库文件可能没有更新,导致表结构不符合预期(比如字段缺失)。
排查步骤:
- 用Android Studio的
Device File Explorer找到你的App数据目录:/data/data/com.example.myapp/databases/vip.db - 下载这个.db文件,用SQLite查看工具(比如SQLiteStudio)打开,确认
Prayers_table的字段是否和你预期的一致。
如果表结构不对,可以:
- 卸载App重新安装,触发
onCreate方法创建新表; - 或者修改
DatabaseHelper的构造函数里的版本号(比如从1改为2),这样会触发onUpgrade方法删除旧表并重建。
3. 添加错误日志定位具体问题
db.insert()返回-1时,SQLite会记录具体的错误信息,你可以在代码里添加日志来查看:
修改DatabaseHelper的SubmitPrayer方法:
import android.util.Log; // 记得导入Log类 public boolean SubmitPrayer(String name, String email, String phone ,String prayer){ SQLiteDatabase db = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(COL2,name); contentValues.put(COL3,email); contentValues.put(COL4,phone); contentValues.put(COL5,prayer); long result = db.insert(TABLE_NAME, null, contentValues); if(result == -1){ // 打印错误日志 Log.e("DatabaseError", "插入失败原因: " + db.getLastErrorMsg()); return false; }else{ return true; } }
然后查看Logcat里的DatabaseError标签,就能看到具体的失败原因(比如字段不存在、约束冲突等)。
4. 检查输入数据的合法性
虽然你的建表语句没有设置NOT NULL约束,但如果输入的某些数据格式不符合字段类型(比如Phone字段是VARCHAR,但你输入了非字符串?不过EditText的getText().toString()都是字符串,这个概率很低),也可能导致插入失败。可以在插入前简单校验输入是否为空:
// 在Activity2的onClick方法里添加校验 String name = Name.getText().toString().trim(); String email = Email.getText().toString().trim(); String phone = Phone.getText().toString().trim(); String prayer = Prayer.getText().toString().trim(); if(name.isEmpty() || email.isEmpty() || phone.isEmpty() || prayer.isEmpty()){ Toast.makeText(Activity2.this, "请填写所有字段", Toast.LENGTH_SHORT).show(); return; }
内容的提问来源于stack exchange,提问作者pca

