【Android ORM对象关系映射之GreenDAO建立多表关联】非淡泊无以明志,非宁静无以致远。这篇文章主要讲述Android ORM对象关系映射之GreenDAO建立多表关联相关的知识,希望能为你提供帮助。
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 = 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类:
发现多了一个
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
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
public Student getStudent(){//...}
public Course getCourse(){//...}
- 1
- 2
推荐阅读
- Android通过Chrome Inspect调试WebView出现404页面的解决方法
- 安卓混合开发——原生Java和H5交互,保证你一看就懂!
- BCB 如何让Application收到SendMessage发送来的消息
- 2017中国大学生程序设计竞赛 - 女生专场Happy Necklace(递推+矩阵快速幂)
- java~modelMapper需要注意的几点
- Win10系统输入法切换不了怎样处理?
- Win10应用商店变成英文怎样改成中文?
- Win10蓝屏代码大全 Win10系统蓝屏怎样处理
- Win10系统怎样隐藏任务栏?