GreenDao的使用(二)

概述

上篇的《GreenDao的使用(一)》是大概介绍了一下GreenDao的理论知识,这次尝试用GreenDao做一些实际项目中的需求。更多的是为展示GreenDao的优点。

需求分析

实际使用需结合具体的需求,如图:
需求
这是一个简化的公司关系图,需要注意的是一对一和多对多的关系。通过查询一个员工,可以关联到该员工的领导以及工牌信息。就是今天主要做的功能。

具体实现

创建Entity

根据需求可以知道需要三个Entity,分别是Employee,leader,IDCard
Employee.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Entity
public class Employee {
@Id(autoincrement = true)//主键自增长
Long id;//主键
String sex;//性别
int age;//年龄
@ToOne(joinProperty = "id")//一个员工有一个工牌
IDCard idCard;
@ToMany//员工与领导的绑定关系
@JoinEntity(entity = LeaderJoinEmployee.class,
sourceProperty = "eId",
targetProperty = "lId")
List<Leader> leaderList;//一个员工有多个领导
}

Leader.class:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Entity
public class Leader {
@Id//(autoincrement = true)//自增长
Long id;//主键
String sex;//性别
int age;//年龄
@ToOne(joinProperty = "id")//一个领导有一个工牌
IDCard idcard;
@ToMany//领导与员工的绑定关系
@JoinEntity(entity = LeaderJoinEmployee.class,
sourceProperty = "lId",
targetProperty = "eId")
List<Employee> employeeList;//一个领导管理着多个员工
}

IDCard.class:

1
2
3
4
5
6
7
8
@Entity
public class IDCard {
@Id
Long id;//主键
String name;//姓名
@Unique//工号不可重复
String employeeNo;//工号
}

这里还需要一个领导与员工多对多的关系表
LeaderJoinEmployee.class:

1
2
3
4
5
6
7
@Entity
public class LeaderJoinEmployee {
@Id
private Long id;
private Long lId;//领导id
private Long eId;//员工id
}

绑定关系

1
2
3
4
5
6
7
8
9
10
11
12
13
IDCard idCard1 = new IDCard(null,"Tom","N111111");//有多少人就有多少个工牌,以工牌对应人
Long id1 = MyApplication.getDaoSession().getIDCardDao().insertOrReplace(idCard1);//获取该工牌id
Employee employee1 = new Employee(id1,"男",23);//工牌id对应员工id
employee1.setIdCard(idCard1);//该员工绑定该工牌

//领导绑定工牌的关系与员工绑定工牌的关系相同
IDCard idCard5 = new IDCard(null,"领导1","L1111111");
Long id5 = MyApplication.getDaoSession().getIDCardDao().insertOrReplace(idCard5);
Leader leader1 = new Leader(id5,"女",32);
leader1.setIdcard(idCard5);

//领导绑定员工的关系,例如领导1管理着Tom,Tom的其中一位领导就是领导1
LeaderJoinEmployee leaderJoinEmployee1 = new LeaderJoinEmployee(null,5L,1L);

查看关系

1
2
3
4
5
6
7
8
9
List<Employee> employeeList = MyApplication.getDaoSession().queryBuilder(Employee.class).list();//获取所有员工
//打印所有员工的所有领导
for (int i = 0; i < employeeList.size(); i++) {
for (int j = 0; j < employeeList.get(i).getLeaderList().size(); j++) {
Log.e("Tag","职员: ("+employeeList.get(i).getIdCard().getEmployeeNo()+")"+employeeList.get(j).getIdCard().getName()+" 的领导是:("+employeeList.get(i).getLeaderList().get(j).getIdcard().getEmployeeNo()+")"+employeeList.get(i).getLeaderList().get(j).getIdcard().getName());
}
}

//领导类似,省略。。。

结果:
结果

源码

点我查看源码