问题描述
假设我想像普通 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 表具有 idPerson 和 idBrand 列,并且您的 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