带有两个外键的房间@Relation

问题描述

我有一个三个实体:

enter image description here

假设我想像普通 SELECT 一样接收带有所有者和品牌的汽车,我只接收外键的 ID。

我的方法是使用@Relation:

public class CarWithPersonAndBrand {

    @Embedded Person person;
    @Relation(parentColumn =  "id",entityColumn = "brandId",entity = Brand.class)
    Car brand;
    
    @Relation(parentColumn =  "id",entityColumn = "personId",entity = Person.class)
    Car car; //this would not make anysence???
}

但是使用关系注释,我收到了注释外键的对象,但是我想要其他方式。与其接收两个汽车对象,这并不能说明我的建议是使用 @Relation 注释接收品牌和人物对象,这可能吗?

解决方法

考虑您想要CarWithPersonAndBrand

所以您想要汽车与各自的(相关)人物和各自的品牌

因此,您可以从 Car 表中获取 Car,并从相应的相关表中获取相关人员和相关品牌。

所以你可以使用:-

class CarWithPersonAndBrand {

    @Embedded
    Car  car;
    @Relation(entity = Person.class,parentColumn = "idPerson",entityColumn = "personId")
    Person person;
    @Relation(entity = Brand.class,parentColumn = "idBrand",entityColumn = "brandId")
    Brand brand;
}

这是使用您的图表构建的,该图表显示 Car 表具有 idPersonidBrand 列,并且您的 CarWithPersonAndBrand 类指示 Person 表具有 personId 列,并且品牌表有列brandId(每个都唯一标识各自的行)。

使用以下 Dao :-

@Transaction
@Query("SELECT * FROM car")
List<CarWithPersonAndBrand> getAllCarsWithPersonAndBrand();

活动中的以下内容:-

public class MainActivity extends AppCompatActivity {

    MotorDatabase db;
    AllDao dao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        db = MotorDatabase.getInstance(this);
        dao = db.getAllDao();

        Person p1 = new Person("Mary");
        Person p2 = new Person("Fred");
        Brand b1 = new Brand("Ford");
        Brand b2 = new Brand("Chevrolet");


        p1.personId = dao.insert(p1);
        p2.personId = dao.insert(p2);
        b1.brandId = dao.insert(b1);
        b2.brandId = dao.insert(b2);

        Car c1 = new Car("MyCar",p1.personId,b1.brandId);
        Car c2 = new Car("TheirCar",p2.personId,b1.brandId);
        dao.insert(c1);
        dao.insert(c2);
        List<CarWithPersonAndBrand> carsList = dao.getAllCarsWithPersonAndBrand();

        for (CarWithPersonAndBrand c: carsList) {
            Log.d("CARINFO","Car is " + c.car.carName + " owner is " + c.person.personName + " brand is " + c.brand.brandName);
        }
    }
}

然后输出到上面的日志的结果是:-

D/CARINFO: Car is MyCar owner is Mary brand is Ford
D/CARINFO: Car is TheirCar owner is Fred brand is Ford