You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:27:01