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

Android SQLite中外键始终为Null的问题及示例代码请求

解决Item表外键ItemGroup_ID始终为Null的问题

你的核心问题是插入Item数据时未给外键字段赋值,同时需要确保实体类包含外键属性、SQLite外键约束启用,以下是完整修正方案:

1. 完善Item实体类

给Item类添加外键属性itemGroupId,并补充对应的getter/setter:

public class Item {
    private long id;
    private String item_name;
    private String item_SKU;
    private String item_brand;
    private String item_color;
    private long itemGroupId; // 关联ItemGroup的外键属性

    // 构造方法(按需定义)
    public Item() {}

    // getter & setter
    public long getItemGroupId() {
        return itemGroupId;
    }

    public void setItemGroupId(long itemGroupId) {
        this.itemGroupId = itemGroupId;
    }

    // 其他属性的getter/setter省略
}

2. 修改Item插入方法,添加外键赋值

在addOne(Item item)中补充外键字段的赋值逻辑:

public boolean addOne(Item item) {
    openWD();
    ContentValues cv = new ContentValues();
    cv.put(RawColumnContract.RawColumnEntry.COLUMNS_NAME_ITEM[0], item.getItem_name());
    cv.put(RawColumnContract.RawColumnEntry.COLUMNS_NAME_ITEM[1], item.getItem_SKU());
    cv.put(RawColumnContract.RawColumnEntry.COLUMNS_NAME_ITEM[2], item.getItem_brand());
    cv.put(RawColumnContract.RawColumnEntry.COLUMNS_NAME_ITEM[3], item.getItem_color());
    // 关键:设置外键值,关联目标ItemGroup的ID
    cv.put(RawColumnContract.RawColumnEntry.COLUMNS_NAME_ITEM[4], item.getItemGroupId());

    long insert = db.insert(RawColumnContract.RawColumnEntry.TABLE_NAMES[1], null, cv);
    return insert != -1;
}

3. 启用SQLite外键约束(推荐)

SQLite默认关闭外键约束,需在数据库配置时开启,避免无效外键值插入:

@Override
public void onConfigure(SQLiteDatabase db) {
    super.onConfigure(db);
    // 启用外键约束,确保外键关联有效
    db.setForeignKeyConstraintsEnabled(true);
}

4. 优化ItemGroup插入方法,返回插入ID

原addOne(ItemGroup)返回布尔值,改为返回插入的ID,方便直接获取外键值:

public long insertItemGroupAndGetId(ItemGroup itemGroup) {
    openWD();
    ContentValues cv = new ContentValues();
    cv.put(RawColumnContract.RawColumnEntry.COLUMN_NAME_GROUP_ITEM[1], itemGroup.getItemGroup_Name());

    return db.insert(RawColumnContract.RawColumnEntry.TABLE_NAMES[0], null, cv);
}

5. 正确的插入流程示例

先插入ItemGroup获取ID,再关联到Item中插入:

// 1. 插入ItemGroup并获取ID
ItemGroup electronicGroup = new ItemGroup();
electronicGroup.setItemGroup_Name("电子产品");
long groupId = dbHelper.insertItemGroupAndGetId(electronicGroup);

if (groupId != -1) {
    // 2. 创建Item并关联外键
    Item phoneItem = new Item();
    phoneItem.setItem_name("智能手机");
    phoneItem.setItem_SKU("PHONE001");
    phoneItem.setItem_brand("XX品牌");
    phoneItem.setItem_color("深空灰");
    phoneItem.setItemGroupId(groupId); // 绑定外键

    // 3. 插入Item
    boolean isItemInserted = dbHelper.addOne(phoneItem);
}

内容的提问来源于stack exchange,提问作者khalid morrshid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:25:01