目录
前言
前两篇文章中对GreenDao如何简单使用和增删改查及升级数据库的事情做了介绍,没有了解到的小伙伴可以从下面的链接进入了解。今天这篇文章主要要介绍的是如何对GreenDao设计的数据库进行多表关系操作等。
正文
一对一关系
使用注解:@ToOne(joinProperty = "childId")
举个栗子:一个单亲家庭有一个孩子。User->UserSon (可能描述不太准确,就凑合表示吧。)
上代码:
@Entity
public class User {
@Id
private Long id;
private String name;
//添加age字段
private String age;
//一对一
@ToOne(joinProperty = "userSonId")
private UserSon userSon;
...
}
@Entity
public class UserSon {
@Id
private Long sonId;
private String name;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Long getSonId() {
return this.sonId;
}
public void setSonId(Long sonId) {
this.sonId = sonId;
}
@Generated(hash = 850860055)
public UserSon(Long sonId, String name) {
this.sonId = sonId;
this.name = name;
}
@Generated(hash = 2075218724)
public UserSon() {
}
}
具体使用:
/**
* 增加用户
*/
private void addUser() {
try {
User user = new User(null, "wj", "18", 100L);
User user1 = new User(null, "hannah", "28", 101L);
UserSon userSon = new UserSon(100L, "wj son");
UserSon userSon1 = new UserSon(101L, "hannah son");
MyApplication.getContext().getSession().getUserDao().insert(user);
MyApplication.getContext().getSession().getUserDao().insert(user1);
MyApplication.getContext().getSession().getUserSonDao().insert(userSon);
MyApplication.getContext().getSession().getUserSonDao().insert(userSon1);
Log.v("GreenDao for user&son", "添加完成");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 查询数据
*/
private void searchUser() {
List<User> users = MyApplication.getContext().getSession().getUserDao().loadAll();
for (User user : users) {
Log.v("GreenDao for user&Son", "查询:姓名:" + user.getName() + " --- 年龄:" + user.getAge() + "----用户ID:" + user.getId() + "----- 儿子姓名:" + user.getUserSon().getName());
}
}
打印日志:
GreenDao for user&son: 添加完成
GreenDao for user&Son: 查询:姓名:wj --- 年龄:18----用户ID:1----- 儿子姓名:wj son
GreenDao for user&Son: 查询:姓名:hannah --- 年龄:28----用户ID:2----- 儿子姓名:hannah son
一对多关系
使用注解:@ToMany(referencedJoinProperty = "parentId")
举个栗子:用户有多种商品。User->UserGoods。
上代码:
@Entity
public class User {
@Id
private Long id;
private String name;
//添加age字段
private String age;
//一对一
@ToOne(joinProperty = "userSonId")
private UserSon userSon;
//一对多 此处的userId是在UserGoods中定义的一个变量
@ToMany(referencedJoinProperty = "userIdForGoods")
private List<UserGoods> userGoodsList;
...
}
@Entity
public class UserGoods {
@Id
private Long id;
private String name;
private String deadline;
//此处自定义userIdForGoods,用于和User中对应
private Long userIdForGoods;
...
}
具体使用:
/**
* 增加
*/
private void addUser() {
try {
User user = new User();
user.setId(20L);
user.setName("wj 1");
user.setAge("18");
user.setUserSonId(110L);
User user1 = new User();
user1.setId(21L);
user1.setName("hannah 1");
user1.setAge("28");
user1.setUserSonId(111L);
UserSon userSon = new UserSon(110L, "wj1 son");
UserSon userSon1 = new UserSon(111L, "hannah1 son");
addGoods();
MyApplication.getContext().getSession().getUserDao().insert(user);
MyApplication.getContext().getSession().getUserSonDao().insert(userSon);
MyApplication.getContext().getSession().getUserDao().insert(user1);
MyApplication.getContext().getSession().getUserSonDao().insert(userSon1);
Log.v("GreenDao for user&son", "添加完成");
} catch (Exception e) {
e.printStackTrace();
}
}
private void searchUserGoods() {
List<UserGoods> userGoods = MyApplication.getContext().getSession().getUserGoodsDao().loadAll();
List<User> users = MyApplication.getContext().getSession().getUserDao().loadAll();
for (UserGoods goods : userGoods) {
Log.v("GreenDao for goods", "查询:" + goods.getName() + " #### 用户ID:" + goods.getUserId() + "####" + goods.getDeadline());
}
for (User user : users) {
Log.v("GreenDao for user", "查询:" + user.getName() + " @@@@@ " + user.getId() + "@@@@@ " + user.getUserGoodsList().size());
for (UserGoods goods : user.getUserGoodsList()) {
Log.v("GreenDao for goods 里面", "查询:用户名:" + user.getName() + "!!!商品名:" + goods.getName() + " !!!! 用户ID:" + goods.getUserId() + "!!!!" + goods.getDeadline());
}
}
}
private void addGoods() {
UserGoods goods1 = new UserGoods(1L, "电脑", "2018-01-01", 20L);
MyApplication.getContext().getSession().getUserGoodsDao().insert(goods1);
UserGoods goods2 = new UserGoods(2L, "手机", "2018-11-01", 20L);
MyApplication.getContext().getSession().getUserGoodsDao().insert(goods2);
}
打印日志:
GreenDao for user&son: 添加完成
GreenDao for goods: 查询:电脑 #### 用户ID:20####2018-01-01
GreenDao for goods: 查询:手机 #### 用户ID:20####2018-11-01
GreenDao for user: 查询:wj @@@@@ 1@@@@@ 0
GreenDao for user: 查询:hannah @@@@@ 2@@@@@ 0
GreenDao for user: 查询:wj 1 @@@@@ 20@@@@@ 2
GreenDao for goods 里面: 查询:用户名:wj 1!!!商品名:电脑 !!!! 用户ID:20!!!!2018-01-01
GreenDao for goods 里面: 查询:用户名:wj 1!!!商品名:手机 !!!! 用户ID:20!!!!2018-11-01
GreenDao for user: 查询:hannah 1 @@@@@ 21@@@@@ 0
多对多关系
使用注解:@JoinEntity(
entity = TeacherJoinStudentBean.class,
sourceProperty = "tId",
targetProperty = "sId")
举个栗子:一个老师可以教多个学生,多个学生可以学习多个老师的课程。TeacherBean<->StudentBean。
上代码:
@Entity
public class TeacherBean {
@Id
private Long id;
private String name;
private String job;
//entity指的是绑定类
//sourceProperty填写绑定类中标示自身的id,此处为tId,指TeacherBean的id
//targetProperty填写绑定类中标示关联类的id,此处为sId,指StudentBean的id
@ToMany
@JoinEntity(entity = TeacherJoinStudentBean.class,
sourceProperty = "tId",
targetProperty = "sId"
)
private List<StudentBean> studentBeanList;
}
@Entity
public class StudentBean {
@Id
private Long id;
private String name;
private int age;
//多对多关系
//entity指的是绑定类
//sourceProperty填写绑定类中标示自身的id,此处为sId,指StudentBean的id
//targetProperty填写绑定类中标示关联类的id,此处为tId,指TeacherBean的id
@ToMany
@JoinEntity(entity = TeacherJoinStudentBean.class,
sourceProperty = "sId",
targetProperty = "tId")
private List<TeacherBean> teacherBeanList;
}
@Entity
public class TeacherJoinStudentBean {
@Id
private Long id;
private Long tId;
private Long sId;
public Long getSId() {
return this.sId;
}
public void setSId(Long sId) {
this.sId = sId;
}
public Long getTId() {
return this.tId;
}
public void setTId(Long tId) {
this.tId = tId;
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
@Generated(hash = 998000662)
public TeacherJoinStudentBean(Long id, Long tId, Long sId) {
this.id = id;
this.tId = tId;
this.sId = sId;
}
@Generated(hash = 1542025906)
public TeacherJoinStudentBean() {
}
}
具体使用:
private void test2Many() {
List<TeacherBean> teacherBeans = new ArrayList<>();
String job = "";
for (long i = 1; i <= 2; i++) {
if (i == 1) {
job = "语文";
} else if (i == 2) {
job = "数学";
} else {
job = "英语";
}
TeacherBean teacherBean = new TeacherBean(i, "老师 " + i, job);
teacherBeans.add(teacherBean);
}
MyApplication.getContext().getSession().getTeacherBeanDao().insertInTx(teacherBeans);
List<StudentBean> studentBeans = new ArrayList<>();
int age;
for (long i = 1; i <= 3; i++) {
if (i == 1) {
age = 18;
} else if (i == 2) {
age = 20;
} else {
age = 3;
}
StudentBean studentBean = new StudentBean(i, "学生 " + i, age);
studentBeans.add(studentBean);
}
MyApplication.getContext().getSession().getStudentBeanDao().insertInTx(studentBeans);
List<TeacherJoinStudentBean> joinStudentBeans = new ArrayList<>();
//对应关系 老师1带 学生1 学生2
TeacherJoinStudentBean joinStudentBean = new TeacherJoinStudentBean(null, 1L, 1L);
joinStudentBeans.add(joinStudentBean);
TeacherJoinStudentBean joinStudentBean1 = new TeacherJoinStudentBean(null, 1L, 2L);
joinStudentBeans.add(joinStudentBean1);
//老师2 带学生1 学生3
TeacherJoinStudentBean joinStudentBean2 = new TeacherJoinStudentBean(null, 2L, 1L);
joinStudentBeans.add(joinStudentBean2);
TeacherJoinStudentBean joinStudentBean3 = new TeacherJoinStudentBean(null, 2L, 3L);
joinStudentBeans.add(joinStudentBean3);
MyApplication.getContext().getSession().getTeacherJoinStudentBeanDao().insertInTx(joinStudentBeans);
//打印数据
List<TeacherBean> allTeacherList = MyApplication.getContext().getSession().getTeacherBeanDao().loadAll();
for (int i = 0; i < allTeacherList.size(); i++) {
Log.v("GreenDao for Teacher", "查询:" + allTeacherList.get(i).getName() + " **** " + allTeacherList.get(i).getJob() + " &&& 学生个数:" + allTeacherList.get(i).getStudentBeanList().size());
for (int j = 0; j < allTeacherList.get(i).getStudentBeanList().size(); j++) {
Log.v("GreenDao for T&S", "查询:" + allTeacherList.get(i).getName() + " **** " + allTeacherList.get(i).getJob() + " &&& 学生个数:" + allTeacherList.get(i).getStudentBeanList().size() + " !!! 学生名字:" + allTeacherList.get(i).getStudentBeanList().get(j).getName() + " ##### 学生年龄:" + allTeacherList.get(i).getStudentBeanList().get(j).getAge());
}
}
}
日志打印:
GreenDao for Teacher: 查询:老师 1 **** 语文 &&& 学生个数:2
GreenDao for T&S: 查询:老师 1 **** 语文 &&& 学生个数:2 !!! 学生名字:学生 1 ##### 学生年龄:18
GreenDao for T&S: 查询:老师 1 **** 语文 &&& 学生个数:2 !!! 学生名字:学生 2 ##### 学生年龄:20
GreenDao for Teacher: 查询:老师 2 **** 数学 &&& 学生个数:2
GreenDao for T&S: 查询:老师 2 **** 数学 &&& 学生个数:2 !!! 学生名字:学生 1 ##### 学生年龄:18
GreenDao for T&S: 查询:老师 2 **** 数学 &&& 学生个数:2 !!! 学生名字:学生 3 ##### 学生年龄:3
注意:
以上三种类型的关系,删除时候都不会关联删除。
结语
好啦。GreenDao对数据库的多表操作就到这儿啦。有任何疑问和建议等都可以留言和私信我哦。共同进步!
附文
个人微信公众号:摩羯座程序媛的日常 (dreamflower_hannah)