https://blog.csdn.net/u010687392/article/details/48496299

利用GreenDAO可以非常方便的建立多张表之间的关联

一对一关联

通常我们在操作数据库的时候,我们往往不是单独的对一张表进行操作,而是对这张表的操作会联动的影响另外一张表或者多张表,比如:现在有两张表,一张是用户User表(有name、age、sex三个字段),一张是头像Picture表(有pictureId、pictureName、width、height四个字段)。假如用户表和头像表是一对一关系,一个用户只有一个头像,一个头像只能有一个用户,所以要建立这两张表之间的联系,这两张表肯定是需要关联的,这样就可以通过用户的信息得到它的头像信息。我们知道在数据库中,关联两张表(暂且不说多对多关系的)一般都是把一张表的主键作为另外一张表的外键来做的,所以在Android中也同样,如果我们要关联User表和Picture表,那么只需要把Picture表的主键(假如是pictureId)作为User表的外键即可,另外一个亦是如此,如: 
 
假设还是以上面的场景为例,则利用GreenDAO建立User表和Picture表一对一的关联可以这样建立:

//把User表的主键name作为Picture表的外键,把Picture的主键pictureId作为User表的外键,这样得到任何一个实体的信息都可以得到关联的另外一个实体的信息
Property property = user.addLongProperty("pictureId").getProperty();
user.addToOne(picture,property); Property propertyName = picture.addStringProperty("name").getProperty();
picture.addToOne(user,propertyName);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在为Schema添加实体的时候,我们在相应的实体中添加另外一个表的主键即可:

        Schema schema = new Schema(1,"com.sunzxyong.greendao2");
//User
Entity user = schema.addEntity("User");
user.addStringProperty("name").notNull().primaryKey();
user.addStringProperty("sex");
//Picture
Entity picture = schema.addEntity("Picture");
picture.addLongProperty("pictureId").primaryKey();
picture.addStringProperty("pictureName").notNull();
picture.addIntProperty("width");
picture.addIntProperty("height");
//建立一对一关联
Property property = user.addLongProperty("pictureId").getProperty();
user.addToOne(picture,property); Property propertyName = picture.addStringProperty("name").getProperty();
picture.addToOne(user,propertyName); new DaoGenerator().generateAll(schema, "../GreenDAODemo/app/src/main/java-gen");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

【注意】:目前多表关联只能支持关联的表只能有一个主键,所以我们不能加入user.addIdProperty();或者在表中设置了两个主键,因为user.addIdProperty();默认会把id作为主键。所以当你的某张表存在与其它表关联时,你需要检查所关联的那张表是否只设置了一个主键,否则将会报错。

当右键运行生成相应的实体后,我们可以打开User类: 
发现多了一个pictureId属性,这正是User表的外键,Picture的主键,然后构造方法也需要我们传入pictureId的值: 
 
 
User类中还提供了一个getPicture()方法,供我们直接得到当前User的Picture对象而得到相应信息,实际上它内部已经帮我们封装好了相应的查询方法,我们只需直接调用即可: 
 
同样Picture类中也是这样。

一对多关联

大家都知道在超市购物时候,一位顾客可以有很多订单,而一个订单只能属于一位顾客,所以这就成了一对多的关系,假设顾客Customer表有customerId(primaryKey)、name两个属性,订单Order表有orderId(primaryKey)、money两个属性。 
 
所以建立顾客和订单之间的一对多关联为:

        Schema schema = new Schema(1,"com.sunzxyong.greendao3");
//顾客
Entity customer = schema.addEntity("Customer");
customer.addLongProperty("customerId").primaryKey();
customer.addStringProperty("name").notNull(); //订单
Entity order = schema.addEntity("Order");
order.addLongProperty("orderId").primaryKey();
order.addDoubleProperty("money").notNull(); //建立一对多关联(顾客对订单为一对多)
Property property = order.addLongProperty("customerId").getProperty();
order.addToOne(customer,property);
customer.addToMany(order,property).setName("orders"); new DaoGenerator().generateAll(schema, "../GreenDAODemo/app/src/main/java-gen");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

当设置了顾客对订单一对多关联后,Order实体(和表)中会多一个属性为customerId,所以通过订单我们可以得到该顾客信息,而Customer实体(和表)中会多一个List集合变量:List<Order> orders,表示该顾客的所有订单,其中orders其实是我们自定义的名字,在刚刚setName("orders")就是给这个变量设置了“orders“名称,而Customer实体中还提供了一个方法getOrders()表示得到该顾客所有订单:

List<Order> orders = customer.getOrders();
  • 1

 
事实上它也是封装好了查询Order中顾客id为customerId的所有订单。

多对多关联

通常来说,在建立多对多关联上,我们都会采用新建一张中间表,利用中间表把多对多这种复杂关系简单化,在通常的选课系统上,一个学生可以选择多门课,一门课可以被多个学生选,这就是多对多关系了,假设Student有studentId、name两个属性,Course有courseId、courseName两个属性,则建立多对多关系为: 

        Schema schema = new Schema(1,"com.sunzxyong.greendao4");
//学生
Entity student = schema.addEntity("Student");
student.addLongProperty("studentId").primaryKey();
student.addStringProperty("name").notNull(); //课程
Entity course = schema.addEntity("Course");
course.addLongProperty("courseId").primaryKey();
course.addStringProperty("courseName").notNull(); //建立多对多关联
Entity studentCourse = schema.addEntity("StudentCourse");
Property studentId = studentCourse.addLongProperty("studentId").getProperty();
Property courseId = studentCourse.addLongProperty("courseId").getProperty();
studentCourse.addToOne(student,studentId);
studentCourse.addToOne(course,courseId);
student.addToMany(studentCourse, studentId);
course.addToMany(studentCourse,courseId); new DaoGenerator().generateAll(schema, "../GreenDAODemo/app/src/main/java-gen");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

这样就建立学生和课程表多对多的关联,学生实体和课程实体中都有这么一个方法:

public List<StudentCourse> getStudentCourseList(){
//...
}
  • 1
  • 2
  • 3

意思就是得到一个StudentCourse的集合,而StudentCourse实体中又有这么两个方法:

 public Student getStudent(){//...}
public Course getCourse(){//...}
  • 1
  • 2

所以当我们得到了StudentCourse的List集合,我们可以通过StudentCourse中的这两个方法来得到对应的学生或者课程信息。

Android ORM对象关系映射之GreenDAO建立多表关联的更多相关文章

  1. ORM对象关系映射之GreenDAO建立多表关联

    利用GreenDAO可以非常方便的建立多张表之间的关联 一对一关联 通常我们在操作数据库的时候,我们往往不是单独的对一张表进行操作,而是对这张表的操作会联动的影响另外一张表或者多张表,比如:现在有两张 ...

  2. ORM对象关系映射之GreenDAO源码解析

    上一篇我们学习了GreenDAO的CRUD基本操作,可以说是非常的方便的,而且GreenDAO的效率和性能远远高于其它两款流行的ORM框架,下面是我从官网找的一副它们三个ORM框架之间的性能测试的直观 ...

  3. ORM对象关系映射之GreenDAO高级用法

    CRUD 增加: dao.insert(Student entity);//添加一个 dao.insertInTx(Student... entity);//批量添加 删除: dao.deleteBy ...

  4. ORM对象关系映射之GreenDAO自定义属性转换器PropertyConverter

    在使用GreenDAO定义实体的属性时候,通常来说定义的实体属性名就是对应的表的字段名.实体中属性的类型(如Long.String等)就是表的字段名类型,但是我们难免会有不一样的需求,比如实体中我定义 ...

  5. ORM 对象关系映射

    ORM (object relation mapping) 就是将对象数据转换为sql语句并执行 对象关系映射框架 orm 需要做的事情 1 生成创建表的语句 2 插入数据的语句 3 删除数据的语句 ...

  6. Django---静态文件配置,post提交表单的csrf问题(日后细说),创建app子项目和分析其目录,ORM对象关系映射简介,Django操作orm(重点)

    Django---静态文件配置,post提交表单的csrf问题(日后细说),创建app子项目和分析其目录,ORM对象关系映射简介,Django操作orm(重点) 一丶Django的静态文件配置 #we ...

  7. Java 自定义注解实现ORM对象关系映射

    一,ORM概念 ORM即Object Relation Mapping,Object就是对象,Relation就是关系数据库,Mapping映射,就是说Java中的对象和关系数据库中的表存在一种对应关 ...

  8. Php ORM 对象关系映射

    ORM的全称是Object Relational Mapping,即对象关系映射.它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,并通过面向对象(Object-Oriented)的方式将 ...

  9. $Django setting.py配置 ,GET、POST深入理解,三件套,orm对象关系映射简介

    1 django中app的概念: 大学:----------------- 项目  信息学院 ----------app01  物理学院-----------app02 ****强调***:创建的每一 ...

随机推荐

  1. linux下libphenom的测试代码

    使用说明:测试使用libphenom库的字符串追加函数,效率是strcat的60多倍.所以在进行大量的字符串累加的时候可以考虑使用libphenom库  依赖库: ck-.tar.gz cmake-. ...

  2. ACM-ICPC2018徐州网络赛 BE, GE or NE(对抗搜索+博弈+记忆化)

    BE, GE or NE 23.58% 1000ms 262144K   In a world where ordinary people cannot reach, a boy named &quo ...

  3. MongoDB官方C#驱动的AsQueryable踩到坑了

    collection.AsQueryable().Where()有4个重载,分别是: public static IQueryable<TSource> Where<TSource& ...

  4. 用matplotlib画线

    1:matplotlib基础 Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形[1] . 通过 Matplotlib,开发者可以 ...

  5. linux命令之ll按时间和大小排序显示

    ll不是命令,是ls -l的别名 按大小排序 [root@localhost ~]# ll -Sh 按时间排序 [root@localhost ~]# ll -rt ll -t 是降序, ll -t ...

  6. 3dmax 法线重置

    从一个模型分离部位时,分离出的部分,面法线发生了混乱,左边原始模型,右边分离后 重置法线方法 对模型(比如对分离出的下半身)添加 EditoNormal修改器 选中模型部位 添加Edit Normal ...

  7. Unity ShaderLab 光照随笔

    unity camera默认3种渲染路径,unity5.50里面有4种 camera Rendering Path 1 vertexLit(逐顶点,一般在vert中处理)  2 forward (前向 ...

  8. Codevs 1159 最大全0子矩阵

    1159 最大全0子矩阵  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 在一个0,1方阵中找出其中最大的全 ...

  9. 阿里云(centos)下svn 服务器搭建

    安装说明 系统环境:阿里云centos安装方式:yum install subversion 检查已安装版本 #检查是否安装了低版本的SVN[root@localhost /]# rpm -qa su ...

  10. 封装MySQL的单例,连接数据库并对数据进行增删改查操作

    单例: 一个类只能有一个对象 应用场景:多次请求数据库只需要一个连接对象. 实现:三私一公 1.私有的静态属性用来保存对象的单例2.私有的构造方法用来阻止在类的外部实例化3.私有的__clone阻止在 ...