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
相关产品推荐
相关产品推荐

