Android优秀开源大牛聚集之地Android开发

ORM 框架之 GreenDao(三)多表关联

2016-05-11  本文已影响8478人  遇见67

GreenDao 中,实体间的关联通过 to-oneto-many 来实现。

一对一

在 GreenDao 中实现一对一的关联需要讲一个实体类的主键作为另一个实体类的外键。
比如一个 Person 有一个 IDCard(身份证),这两者是一一对应的关系,同时,Personname(主键)、sexage 三个属性,
IDCardCardIdCardId(主键) 和 Validity 两个属性。
那么可以将 Person 的主键作为 IDCard 的外键,将 IDCard 的主键作为 Person 的外键:

    Entity person = schema.addEntity("Person");
    person.addStringProperty("name").primaryKey();
    person.addStringProperty("sex");
    person.addLongProperty("age");

    Entity idCard = schema.addEntity("IDCard");
    idCard.addLongProperty("cardId").primaryKey();
    idCard.addLongProperty("validity");

    // 两个实体类通过 Property 来建立关联,此操作会在 person 表中增加一个外键,此外键是 idCard 表中的主键
    Property personProperty = person.addLongProperty("cardId").getProperty();
    // 第一个参数为目标实体类,第二个参数为此表中的外键属性
    person.addToOne(idCard, personProperty);

    Property idCardProperty = idCard.addStringProperty("name").getProperty();
    idCard.addToOne(person, idCardProperty);

注意:当使用多表关联的时候,就不要添加 id 主键了,因为需要将主键作为其它表的外键来使用

一对多

比如一个人去购物,会产生很多订单,一个人会有很多订单,但每个订单只能是一个人的,这样就会产生一对多的关联
这时需要将 Person 的主键作为 Order 的外键,因为我们可以通过订单找到唯一的 Person

    Entity order = schema.addEntity("Order");
    order.addLongProperty("orderId").primaryKey();
    order.addLongProperty("money").notNull();

    Property orderProperty = order.addStringProperty("name").getProperty();

    // 构建一对多的关联
    // 第一个参数为目标实体,第二个参数为目标属性,也就是 person 的主键(order 的外键),第三个参数为属性名
    person.addToMany(order, orderProperty, "orders");
    // 订单对用户为一对一的关联
    order.addToOne(person, orderProperty);

这样在生成的实体类中 Person 实体中会多出 List<Order> orders 的属性,并且提供了 getOrders()方法来得到用户的所有订单
Order 实体类中会多出 name 属性,也就是 Person 表的主键,同时也提供了 getPerson()方法来得到该订单对应的用户

多对多

GreenDao 不支持多对多的关系,但是,我们可以通过其它方法来实现。
实现多对多关联需要建立一张中间表,其它两张表都要与中间表构建一对多的关联。
比如学生与课程之间的连系,一个学生可以选择多种课程,而一个课程可以被多个学生选择

    Entity course = schema.addEntity("Course");
    course.addLongProperty("courseId").primaryKey();
    course.addStringProperty("courseName").notNull();

    // 中间表有其它两个表的主键作为外键
    Entity personCourse = schema.addEntity("PersonCourse");
    Property personName = personCourse.addStringProperty("name").getProperty();
    Property courseId = personCourse.addLongProperty("courseId").getProperty();

    // 分别构建一对多的关联
    person.addToMany(personCourse, personName);
    course.addToMany(personCourse, courseId);

    personCourse.addToOne(person, personName);
    personCourse.addToOne(course, courseId);

这样生成的实体类中,PersonCourse 实体中都会有 List<PersonCourse> personCourseList 属性,
再来看一下 PersonCourse 实体类,有 getPerson()getCourse() 方法获得相应的学生和课程。
这样,我们通过学生和课程得到 PersonCourse 的集合后,通过这两个方法就可以得到相应的学生或者课程的信息

上一篇下一篇

猜你喜欢

热点阅读