Android SQLite数据库中外键booklet_id为空无法自动填充如何解决
问题核心说明
SQLite的外键约束仅用于校验关联数据的合法性,不会自动填充关联字段的值。你当前booklet_id为空的原因是插入demographiccharacteristics表数据时,未主动给该字段赋值,和外键开关状态无关。
解决方案步骤
1. 修改addBooklet方法返回新增的booklet_id
SQLiteDatabase.insert()方法本身会返回新插入行的自增ID,插入失败返回-1,修改方法返回值即可拿到生成的booklet_id:
// 原返回值为boolean,修改为返回long类型的id public long addBooklet(String type1,String province,String municipality,String barangay, String address,String nameofrespondent, String householdhead, String householdtotal, String date,String updated_at) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put("type",type1); contentValues.put("province",province); contentValues.put("citymunicipality",municipality); contentValues.put("barangay",barangay); contentValues.put("address",address); contentValues.put("respondent_name",nameofrespondent); contentValues.put("household_head",householdhead); contentValues.put("hh_mem_count", householdtotal); contentValues.put("created_at", date); contentValues.put("updated_at", updated_at); return db.insert("bookletinfo",null,contentValues); }
2. 保存booklet后将id传递到Survey2页面
在Home页的保存逻辑中,拿到返回的booklet_id后通过Intent传给下一个页面:
save.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 保留原有变量取值逻辑不变 String updated_at = ""; long bookLetId = db.addBooklet(type1,province, municipality, barangay,address,nameofrespondent,householdhead, householdtotal,date,updated_at); if (bookLetId != -1) { Toast.makeText(getApplicationContext(), "Data Inserted", Toast.LENGTH_SHORT).show(); Intent registerIntent = new Intent(home.this, Survey2.class); // 把id存入Intent传递 registerIntent.putExtra("BOOKLET_ID", bookLetId); startActivity(registerIntent); } else { Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_SHORT).show(); } } });
3. Survey2页面接收传递的id
在Survey2的onCreate中增加id接收逻辑:
// 新增成员变量存储当前关联的booklet_id private long currentBookletId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_survey2); db = new DatabaseHelper(Survey2.this); // 接收传过来的id,默认值-1表示非法 currentBookletId = getIntent().getLongExtra("BOOKLET_ID", -1); if (currentBookletId == -1) { Toast.makeText(this, "参数错误,请先创建问卷", Toast.LENGTH_SHORT).show(); finish(); return; } // 保留原有初始化逻辑不变 }
4. 修改addDemographic方法增加id参数
给方法新增bookletId入参,插入时主动给booklet_id字段赋值:
// 新增bookletId参数 public boolean addDemographic(long bookletId, String etQ1,String etQ2,String etQ3,String etQ4,String etQ5,String etQ6,String etQ7,String etQ8,String etQ9,String etQ10,String etQ11,String etQ12,String etQ13,String etQ14, String etbrgy,String created_at,String updated_at) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put("Q1",etQ1); contentValues.put("Q2",etQ2); contentValues.put("Q3",etQ3); contentValues.put("Q4",etQ4); contentValues.put("Q5",etQ5); contentValues.put("Q6",etQ6); contentValues.put("Q7", etQ7); contentValues.put("Q8",etQ8); contentValues.put("Q9",etQ9); contentValues.put("Q10",etQ10); contentValues.put("Q11",etQ11); contentValues.put("Q12",etQ12); contentValues.put("Q13",etQ13); contentValues.put("Q14", etQ14); contentValues.put("currentbrgy",etbrgy); contentValues.put("created_at",created_at); contentValues.put("updated_at", updated_at); // 主动给外键字段赋值 contentValues.put("booklet_id", bookletId); long result = db.insert("demographiccharacteristics",null,contentValues); return result != -1; }
5. 调用插入方法时传入id
修改Survey2的保存逻辑,调用addDemographic时传入接收的currentBookletId:
save.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 保留原有变量取值逻辑不变 String updated_at = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String created_at = sdf.format(new Date()); // 传入booklet_id if (db.addDemographic(currentBookletId, etQ1,etQ2,etQ3,etQ4,etQ5,etQ6,etQ7,etQ8,etQ9,etQ10,etQ11,etQ12,etQ13,etQ14,etbrgy,created_at,updated_at)) { Toast.makeText(getApplicationContext(), "Data Inserted", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_SHORT).show(); } } });
额外说明
你之前开启的外键约束是有效的,后续如果传入的booklet_id在bookletinfo表中不存在,插入会直接失败,能避免出现无效关联的脏数据。
内容的提问来源于stack exchange,提问作者Kim Cedrick Palolan
相关产品推荐
相关产品推荐

