目錄
前言
前兩篇文章中對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)