GreenDao的簡單使用[三]之多表關係操作

目錄

前言

正文

一對一關係

一對多關係

多對多關係

結語

付文:


前言

前兩篇文章中對GreenDao如何簡單使用和增刪改查及升級數據庫的事情做了介紹,沒有瞭解到的小夥伴可以從下面的鏈接進入瞭解。今天這篇文章主要要介紹的是如何對GreenDao設計的數據庫進行多表關係操作等。

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)

CSDN:https://blog.csdn.net/wj9966

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章