【问题标题】:Insert two Entities and join the primary key插入两个实体并加入主键
【发布时间】:2021-04-16 10:29:22
【问题描述】:

我正在尝试将数据同时插入两个表,同时将表 1 中的主键插入表 2。

实体 1:

@Entity (tableName = "all_equip")
public class EquipInfo implements Comparable <EquipInfo>{

@PrimaryKey (autoGenerate = true)
private int equipId;
private int gymId;
private int userId;
private boolean isActive;
private String equipGrade;
...other 

实体 2:

@Entity (tableName = "my_equip_data")
public class MyEquipData {
@PrimaryKey (autoGenerate = true)
private int id;
private int userId;
private int equipId;
...other 

我需要的是,当一个新的实体 1 插入到 all_equip 中时,一个新的实体 2(包含用户特定数据)也插入到 my_equip_data 中,但主键(equipId)来自实体 1。

我正在使用带有 Room 的 SQLite 和简单的 @Insert 查询。

我的道:

@Dao
public interface EquipInfoDao {
@Insert
void insert (EquipInfo equipInfo);

我的实用程序:

public Boolean addNewEquip (Context context, EquipInfo equipInfo) {
    Database.getInstance(context).equipInfoDao().insert(equipInfo);
    return true;
}

我已设法在其他查询中加入这些表,但不确定如何插入第一个实体、检索该新插入条目的equipId,然后将其作为外键添加到第二个实体中。多合一 OnClickListener。

【问题讨论】:

  • 您说您使用的是 sqlite,但添加了一个 标签。你用的是哪一个?

标签: java android sqlite android-room


【解决方案1】:

Room 允许您通过将返回类型指定为 long 来从插入查询返回主键。所以你可以在一个事务中运行两个插入,第二个使用返回的键。像这样的:

@Insert
long insert1(Entity1 e)

@Insert
void insert2(Entity2 e)

@Transaction
insertBoth(Entity1 e1, Entity2 e2) {

    long primaryKey1 = insert(e1);
    e2.setKey1(primaryKey1);
    insert(e2);
}

【讨论】:

  • 优秀。这很完美!谢谢!
【解决方案2】:

如果您将构造函数添加到允许在实例化时构建/填充它们的实体,您可以使用类似的东西:-

dao.insertMyEquipData((new MyEquipData(5000,dao.insertEquipInfo(new EquipInfo(1000,5000,true,"Grade 1")))));
dao.insertMyEquipData((new MyEquipData(6000,dao.insertEquipInfo(new EquipInfo(2000,6000,false,"Grade 2")))));
  • 这会添加 2 个 EquipInfo 和 2 个 MyEquipData,其中将 equipId 传递到 MyEquipData

@Dao 保持不变:-

@Dao
interface EquipInfoDao {

    @Insert
    long insertEquipInfo(EquipInfo equipInfo);

    @Insert
    long insertMyEquipData(MyEquipData equipData);
}

然而实体已经改变

  • id 用 long 代替 int

    • 使用 long 更正确,它在数据库中没有任何区别,因为值将被保存在尽可能少的存储空间中
  • 已添加默认和@Ignore'd 构造函数以方便上述使用。

装备信息:-

@Entity(tableName = "all_equip")
public class EquipInfo /*implements Comparable <EquipInfo>*/ {

    @PrimaryKey(autoGenerate = true)
    private long equipId;
    private long gymId;
    private long userId;
    private boolean isActive;
    private String equipGrade;

    public EquipInfo(){}

    @Ignore
    public EquipInfo(long gymId, long userId, boolean isActive, String equipGrade) {
        this.gymId = gymId;
        this.userId = userId;
        this.isActive = isActive;
        this.equipGrade = equipGrade;
    }

    public void setEquipId(long equipId) {
        this.equipId = equipId;
    }

    public long getEquipId() {
        return equipId;
    }

    public void setGymId(long gymId) {
        this.gymId = gymId;
    }

    public long getGymId() {
        return gymId;
    }

    public void setUserId(long userId) {
        this.userId = userId;
    }

    public long getUserId() {
        return userId;
    }

    public void setActive(boolean active) {
        isActive = active;
    }

    public boolean isActive() {
        return isActive;
    }

    public void setEquipGrade(String equipGrade) {
        this.equipGrade = equipGrade;
    }

    public String getEquipGrade() {
        return equipGrade;
    }
}

我的装备数据:-

@Entity(tableName = "my_equip_data")
public class MyEquipData {
    @PrimaryKey(autoGenerate = true)
    private long id;
    private long userId;
    private long equipId;

    public MyEquipData(){}

    @Ignore
    public MyEquipData(long userId, long equipId) {
        this.userId = userId;
        this.equipId = equipId;
    }

    public void setId(long id) {
        this.id = id;
    }

    public long getId() {
        return id;
    }

    public void setUserId(long userId) {
        this.userId = userId;
    }

    public long getUserId() {
        return userId;
    }

    public void setEquipId(long equipId) {
        this.equipId = equipId;
    }

    public long getEquipId() {
        return equipId;
    }
}

结果(数据库检查器)

【讨论】:

  • 谢谢迈克。这帮助我更好地理解了一点。非常感谢!
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 2012-11-09
  • 2018-04-11
  • 1970-01-01
相关资源
最近更新 更多