GreenDao进阶笔记,通过 注解 JAVA 对象描述数据库表结构,以及实现一对多、多对多的联系,简单直接上代码,后面有详细说明
配置代码
@Entity
public class Soldier{ //人员表
@Id(autoincrement = true)
private Long sID;
@Property
private Long squadID;
@ToOne(joinProperty = "squadID")
private Squad squad;
@Property
private String sName;
@ToMany
@JoinEntity(entity = SoldierSentry.class,sourceProperty = "soldierId",targetProperty = "sentryId")
private List<Sentry> sentryGroup;
@Property
private Integer grade;
}
@Entity
public class Sentry{ //岗位表
@Id
private Long sentry_id;
@Property
private String sentry_name;
@Property
private Integer sentry_type;
@ToMany
@JoinEntity(entity = SoldierSentry.class,sourceProperty = "sentryId",targetProperty = "soldierId")
private List<Soldier> soldiers;
}
@Entity
public class SoldierSentry {//第三者,中间表
@Id(autoincrement = true)
private Long id;
private Long soldierId;
private Long sentryId;
}
@Entity
public class Squad{//班级表
@Id(autoincrement = true)
private Long suqadId;
@Property
private String squadName;
@ToMany(referencedJoinProperty = "squadID")
private List<Soldier> soldiers;
}
GreenDao框架一对一关联
greenDao环境配置不做赘述,直入正题 示例代码中,soldier和squad的关系是一对一的, @ToOne中joinProperty属性是将属性值所代表的id指向当前所注解的实体类 在Soldier中@ToOne 表示的是 将本身属性squadID 关联到Squad实体类
GreenDao框架一对多关联
示例代码中,squad和soldier的关系是一对多的,一个班可以拥有多个人员 @ToMany中,referencedJoinProperty属性是将当前实体的属性关联到其对应的表上 在Squad中@ToMany指的是将Squad当前属性soldiers 关联到Soldier表中的squadID上
GreenDao框架多对多关联
练手项目中,出现这么了一个多对多的关系,即一个人的能力对应多个岗位,一个岗位可以有多个人 而greenDao是没有多对多的关联的,我们需要加入第三者JOIN表 中间表包含了人员和岗位的主键,用于建立两者之间多对多关系。 分别将人员和岗位与中间表建立一对多的关系,并标明属性关系: @JoinEntity 内属性 entity :第三者类文件 sourceProperty:第三者中对应自身的id,在Soldier中是SoldierSentry内的soldierId,在Sentry中就是sentryId targetProperty:第三者中对应的需要关联的id,在Soldier中需要关联的为List<Sentry>集合, 所以属性值为SoldierSentry内的sentryId。同理,Sentry中值就变成了soldierId。
按照以上配置完成后 build 工程,运行测试代码(测试代码运行是初始化了部分数据的,但不影响逻辑):
@Test//测试一个岗位对应多个人员
public void testManyToMany() throws Exception {
SentryDao sentryDao = MyApplication.getApplication().getDaoSession().getSentryDao();//不明白此处查看20170623日志
Sentry sen = sentryDao.queryBuilder()
.where(com.jaylee.duty.db.greendao.SentryDao.Properties.Sentry_id.eq(8L))//id为8的岗位
.build()
.unique();
List<Soldier> s = sen.getSoldiers();//获取到可以胜任该岗位的所有人,查看实现细节可发现最后去查找了第三者表
for (Soldier soldier : s) {
Log.e("SQLTEST",soldier.toString());
}
}
@Test
public void testManyToMany() throws Exception {
SoldierDao soldierDao = MyApplication.getApplication().getDaoSession().getSoldierDao();
SoldierSentryDao soldierSentryDao = MyApplication.getApplication().getDaoSession().getSoldierSentryDao();
List<SoldierSentry> sss = new ArrayList<>();
sss.add(new SoldierSentry(null,41L,1L));
sss.add(new SoldierSentry(null,41L,2L));
sss.add(new SoldierSentry(null,41L,3L));
sss.add(new SoldierSentry(null,41L,10L));
sss.add(new SoldierSentry(null,41L,11L));
sss.add(new SoldierSentry(null,41L,12L));
soldierSentryDao.insertInTx(sss); //向第三者表中添加id为41的人员的假数据
Soldier sol = soldierDao.queryBuilder()
.where(SoldierDao.Properties.SID.eq(41L))//查询id为41的人员
.build()
.unique();
List<Sentry> sentrys = sol.getSentryGroup();//获取该人员负责岗位
for (Sentry sentry : sentrys) {
Log.e("SQLTEST",sentry.toString());
}
}