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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摩羯座程序媛

打赏的老板越来越富

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值