Android中SQLite外键失效:tasks表userId字段插入后为Null
问题分析与解决方案
嘿,我一眼就瞅出问题根源了!你的tasks表userId字段返回Null,核心原因是你完全没把用户ID的值插入到任务表中,具体来看这两个关键问题:
1. insertTasks方法既缺参数又注释了赋值代码
看你的Database类里的insertTasks方法,参数列表里根本没有userId,而且原本给userId字段赋值的代码还被你注释掉了——这就导致插入任务时,userId字段完全没收到值,自然就是Null了:
// 原方法的问题:无userId参数,且注释了赋值 public boolean insertTasks(String taskName, String taskDate, String taskTag, String startTime, String endTime, String notes) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put("taskName", taskName); //contentValues.put("userId", userId); // 这里被注释,且参数里没userId // ... 其他字段赋值 }
2. 调用insertTasks时没传入userId值
在AddNewTask的点击事件里,你明明获取了用户输入的userId(String entry = userId.getText().toString();),但调用insertTasks的时候,压根没把这个值传进去,等于白获取了。
解决方案:两步修复
第一步:修改insertTasks方法,添加userId参数并赋值
把方法签名加上userId参数,同时取消注释赋值代码,注意因为users表的userID是整数类型,参数用int更匹配:
public boolean insertTasks(int userId, String taskName, String taskDate, String taskTag, String startTime, String endTime, String notes) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put("userId", userId); // 取消注释,传入用户ID contentValues.put("taskName", taskName); contentValues.put("taskDate", taskDate); contentValues.put("taskTag", taskTag); contentValues.put("startTime", startTime); contentValues.put("endTime", endTime); contentValues.put("notes", notes); long inst = db.insert("tasks", null, contentValues); return inst != -1; // 简化返回逻辑,不用额外打印日志 }
第二步:修改调用代码,传入userId值
在AddNewTask的点击事件里,把获取到的userId转成整数后传入insertTasks,还要加个非空判断避免崩溃:
saveTask.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String entry1 = taskName.getText().toString(); String userIdStr = userId.getText().toString(); // 变量名更清晰 String entry2 = taskDate.getText().toString(); String entry3 = taskTag.getSelectedItem().toString(); String entry4 = startTime.getText().toString(); String entry5 = endTime.getText().toString(); String entry6 = notes.getText().toString(); // 先判断用户ID是否为空,避免空指针 if(TextUtils.isEmpty(userIdStr)){ Toast.makeText(getApplicationContext(), "请输入用户ID", Toast.LENGTH_SHORT).show(); return; } try { int userId = Integer.parseInt(userIdStr); // 转成整数类型 Boolean extractUserID = db.extractUserID(userIdStr); // 验证用户ID是否存在 if (extractUserID) { Boolean insertTasks = db.insertTasks(userId, entry1, entry2, entry3, entry4, entry5, entry6); // 传入userId if (insertTasks) { Toast.makeText(getApplicationContext(), "Tasks Entered Successfully", Toast.LENGTH_SHORT).show(); //openTasksPage(); } else { Toast.makeText(getApplicationContext(), "Data not inserted", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(getApplicationContext(), "用户ID不存在", Toast.LENGTH_SHORT).show(); } } catch (NumberFormatException e) { Toast.makeText(getApplicationContext(), "请输入有效的数字ID", Toast.LENGTH_SHORT).show(); e.printStackTrace(); } } });
额外提示:外键约束生效问题
你已经在onOpen里设置了PRAGMA foreign_keys=ON,这点做得很好,但要注意:如果你的APP之前已经安装过(此时数据库是没有外键约束的旧版本),需要卸载APP重新安装,或者在onUpgrade方法里处理表的更新,否则新的外键约束不会生效。
内容的提问来源于stack exchange,提问作者nodisplay
相关产品推荐
相关产品推荐

