请选择 进入手机版 | 继续访问电脑版
JAVEN

GreenDao框架使用(三)关联关系使用

所在版块: 课堂笔记 2016-05-04 17:05   [复制链接] 查看: 2001|回复: 1
本帖最后由 yangjw 于 2016-5-4 17:58 编辑

  • 前言
前面介绍了GreenDao的一些基本配置和用法。此篇文章将重点介绍GreenDao的多表之间的关联关系,其中包括一对一,一对多,多对多关系。这些都是数据库的基本知识,即使没有学过数据库也不要紧,我们会举一些例子帮助大家理解。此篇介绍的关联关系主要是介绍怎么配置,只要配置好了自动生成之后,使用的话就跟前面的基本使用是类似的。
官方介绍关联关系的网址:官方文档地址

  • 一对一关系(To-One)
比如QQ中一个用户有一个头像(头像就是一张图片),这就是一个一对一的关系。我们使用GreenDao怎么表现这个一对一关联关系呢?
代码如下:其中建立关联关系重要的一个方法是addToOne()方法。
  1. <div>public static void main(String[] args) {
  2.         try {
  3.             //创建Schema对象,参数2指定Dao对象的包名
  4.             Schema schema = new Schema(1,"com.androidxx.one");
  5.             addUserAndPicture(schema);
  6.             //自动生成DAO对象,放到参数2指定的项目下的指定文件夹下
  7.             new DaoGenerator().generateAll(schema,"../GreenDaoDemo/app/src/main/java");
  8.         } catch (Exception e) {
  9.             e.printStackTrace();
  10.         }
  11.     }

  12.     //添加用户和图片实体,并将其进行一对一关联
  13.     private static void addUserAndPicture(Schema schema) {
  14.         //添加一个图片实体
  15.         Entity picture = schema.addEntity("Picture");
  16.         picture.addIdProperty();
  17.         picture.addStringProperty("imageUrl");

  18.         //添加一个用户实体
  19.         Entity user = schema.addEntity("User");
  20.         user.addIdProperty();
  21.         //在用户实体中添加pictureId的属性,作为外键用于关联Picture实体
  22.         Property pictureId = user.addLongProperty("pictureId").getProperty();
  23.         //通过addToOne方法完成关联关系,之后在自动生成的User实体中会有一个getPicture方法用于获取用户关联的图片。</div><div>//参数一:picture是被关联的对象,参数二:pictureId是User实体中的一个作为外键的属性
  24. user.addToOne(picture,pictureId);
  25.     }</div>
复制代码
如上代码就会自动生成一个User对应一个Picture的一对一关联关系。在自动生成的User.java类中可以找到getPicture方法,从而可以通过User获取与之关联的Picture对象。在使用增删查改功能的时候,将Picture当作User的一个基本属性使用即可。

  • 一对多(To-Many)
举个例子,在淘宝上购物后会生成订单,一个用户可能有多个订单,但是一个订单只能有一个用户,那么用户和订单之间就是一对多的关联关系。接下来使用GreenDao完成一对多关联的配置方式如下:
  1. private static void addCustomerAndOrder(Schema schema) {
  2.         Entity order = schema.addEntity("Order");
  3.         order.addIdProperty();
  4.         order.addDateProperty("orderDate");
  5.         Property customerId = order.addLongProperty("customerId").getProperty();

  6.         Entity customer = schema.addEntity("Customer");
  7.         customer.addIdProperty();
  8.         customer.addStringProperty("customerName");
  9.         //addToMany方法就是建立一对多的关联关系
  10.         //参数一:多的一方的实体对象order
  11.         //参数二:在order实体中的customerId属性,此属性作为Order实体的外键,用于关联Customer对象
  12.         ToMany toMany = customer.addToMany(order, customerId);
  13.         toMany.setName("orders");//设置在Customer对象中的Order属性的名称
  14.     }
复制代码
上述代码中addToMany方法是用于建立一个Customer对象对应多个Order对象。自动生成的Customer对象中会有一个getOrder方法,用户获取此用户关联的所有Order对象,返回的是一个集合。
在上面这个例子中,如果想通过Order通向获取Customer对象就比较复杂,因为Order对象中只有一个customerId属性。如果想通过Order对象获得与之对应的Customer对象,就需要建立双向关联关系;即用户对订单是一对多,一个订单对一个用户是一对一(注意:我说的是一个订单,有条件“一个”)。这样我们实现双向的关联代码如下:
  1. Entity customer = schema.addEntity("Customer");
  2. customer.addIdProperty();
  3. customer.addStringProperty("name").notNull();

  4. Entity order = schema.addEntity("Order");
  5. order.setTableName("ORDERS"); // "ORDER" is a reserved keyword
  6. order.addIdProperty();
  7. Property orderDate = order.addDateProperty("date").getProperty();
  8. Property customerId = order.addLongProperty("customerId").notNull().getProperty();
  9. order.addToOne(customer, customerId);//一个订单对应一个用户

  10. ToMany customerToOrders = customer.addToMany(order, customerId); //一个用户对应多个订单
  11. customerToOrders.setName("orders"); //修改Customer实体中的Order属性的名称
复制代码
上述代码其实就是使用toOne和toMany结合,实现双向的关联。

  • 多对多
举个例子,一个学生可以学习多门课程,一门课程可以由多个学生学习,课程和学生之间就是多对多关系。
在GreenDao中并没有多对多的方法。但是我们可以曲线完成多对多的关系。比如创建一个中间表,使用中间表完成双向一对多关系。比如下图:
QQ截图20160504165427.png
如图,学生和中间表是多对一,课程和中间表也是多对一,间接实现学生和课程之间的多对多关系。即我们可以使用2个addToMany完成多对多的关联关系。


由于GreenDao实现了懒加载和缓存机制。在做多表联合查询或者修改操作的时候,如果修改失败,可能是换成惹的祸。

由于缓存导致的更新BUG,官方给出了解决方案:
Because of caching, you should add new relation entities manually to the to-many list of the source entity. This is how to insert new entities that are part of a to-many relation:
1.Get the to-many Java List (This has to be done this before persisting the new entity, because we do not know if we get a cached for fresh result. Like this, we know it’s cached now.)
2.Create a new entity object (on the many side)
3.Set the foreign property of the new entity to the target entity
4.Persist the new object using insert
5.Add the new object to the to-many Java List

官方的示例代码:
  1. List orders1 = customer.getOrders();
  2. int size1 = orders1.size();

  3. Order order = new Order();
  4. order.setCustomerId(customer.getId());
  5. daoSession.insert(order);

  6. Listorders2 = customer.getOrders();
  7. // size1 == orders2.size(); // NOT updated
  8. // orders1 == orders2; // SAME list object
复制代码
  • 最后
    此篇主要介绍使用GreenDao怎么自动生成一对一、一对多的关联关系。之后的使用方式同上一节[基本使用篇]相同。

下一篇将介绍GreenDao实现数据库的更新操作。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我的博客

QQ|Archiver|手机版|小黑屋|课堂笔记  

GMT+8, 2018-12-12 10:29 , Processed in 0.095348 second(s), 33 queries .

快速回复 返回列表