Java 插入两个实体并连接主键

Java 插入两个实体并连接主键,java,android,sqlite,android-room,Java,Android,Sqlite,Android Room,我试图将数据同时插入到两个表中,同时将表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 bo

我试图将数据同时插入到两个表中,同时将表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 
我需要的是,当一个新的实体1插入到所有设备中时,一个新的实体2(包含用户特定的数据)也会插入到我的设备数据中,但带有实体1的主键(equid)

我将SQLite用于Room和简单的
@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。

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

@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);
}

如果将构造函数添加到实体中,从而允许在实例化时生成/填充它们,则可以使用以下内容:-

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;
    }
}
结果(数据库检查器)


您说您正在使用sqlite,但添加了一个标记。你用哪一个?太好了。这工作做得很好!非常感谢。谢谢你,迈克。这有助于我更好地理解。非常感谢!
@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;
    }
}