博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
greenDao多表关联
阅读量:6758 次
发布时间:2019-06-26

本文共 5206 字,大约阅读时间需要 17 分钟。

之前我们看到了greenDao的简单使用,但是就这些是远远不够的,有时候我们需要存储的数据较为复杂,这个时候我们可能需要使用到多表关联的操作。

ToOne

一对一的关系映射。看个例子:

@Entitypublic class Score {    @Id    private String id;    private int score;}@Entitypublic class Student {    @Id    private String id;    private String name;    private int age;    private String scoreId;    @ToOne(joinProperty = "scoreId")    private Score score;}        //先向数据库中插入两条数据        Score score = new Score("1101", 80);        Student magicer = new Student("110","Magicer",12,"1101");        scoreDao.insertOrReplace(score);        studentDao.insertOrReplace(magicer);                //之后查找我们插入的数据,就可以查询出来我们想要的带有成绩的学生实体。        QueryBuilder
queryBuilder = studentDao.queryBuilder().where(StudentDao.Properties.Name.eq("Magicer")); for (Student student : queryBuilder.list()) { Log.i(TAG, "onCreate: "+student.toString()); }

在上面的例子中,我们设定每个学生有一门成绩,这个时候就是个ToOne一对一的关系。我们通过joinProperty来设置外键。我们就可以很方便的查询出某个学生的成绩了。

public @interface ToOne {    /**     * Name of the property inside the current entity which holds the key of related entity.     * If this parameter is absent(缺少的), then an additional column is automatically created to hold the key.     */    String joinProperty() default "";}

ToMany

但是一般一个学生会有多个成绩,这个时候我们就需要使用ToMany一对多的关系了。先看下例子:

@Entitypublic class Student {    @Id    private String id;    private String name;    private int age;    @ToMany(referencedJoinProperty = "studentId")    private List
scores;}@Entitypublic class Score { @Id private String id; private int score; private String type; private String studentId;} Score math = new Score("1101", 87, "Math", "110"); Score english = new Score("1102", 99, "English", "110"); Score chinese = new Score("1103", 120, "Chinese", "110"); scoreDao.insertOrReplaceInTx(math,english,chinese);//使用事务插入或替换数据 Student magicer = new Student("110", "Magicer", 23); studentDao.insertOrReplace(magicer); Query
query = studentDao.queryBuilder().where(StudentDao.Properties.Name.eq("Magicer")).build(); for (Student student : query.list()) { Log.i(TAG, "onCreate: "+student); }//I/MainActivity: onCreate: Student{id='110', name='Magicer', age=23, score=[Score{id='1101', score=87, type='Math', studentId='110'}, Score{id='1102', score=99, type='English', studentId='110'}, Score{id='1103', score=120, type='Chinese', studentId='110'}]}

这个时候,一个学生就有Math Enghlish Chinese三个的成绩。这个时候,我们使用referencedJoinProperty 将成绩跟学生建立了关联关系。

public @interface ToMany {    /**     * Name of the property inside the target entity which holds id of the source (current) entity     * Required unless no {@link JoinProperty} or {@link JoinEntity} is specified     */    String referencedJoinProperty() default "";    /**     * Array of matching source -> target properties     * Required unless {@link #referencedJoinProperty()} or {@link JoinEntity} is specified     */    JoinProperty[] joinProperties() default {};}

JoinEntity

有时我们还要创建多对多的关联关系N:M。在greenDao中就使用JoinEntity注解;先来看下他的定义:

public @interface JoinEntity {    /** Reference to join-entity class, which holds the source and the target properties */    Class
entity(); /** Name of the property inside the join entity which holds id of the source (current) entity */ String sourceProperty(); /** Name of the property inside the join entity which holds id of the target entity */ String targetProperty();}

配置多对多关系的时候我们需要使用到ToManyJoinEntity通过JoinEntity注解来配置关联的建。如下:

@Entitypublic class Student {    @Id    private String id;    private String name;    private int age;    @ToMany    @JoinEntity(            entity = Join.class,            sourceProperty = "studentId",            targetProperty = "scoreId"    )    private List
scores;}@Entitypublic class Join { @Id private String id; private String studentId; private String scoreId;}@Entitypublic class Score { @Id private String id; private int score; private String type; private String studentId;}

遇到的问题

当插入到数据库中的数据是网络请求得到的时候会有些注意事项。由于greenDao会帮助我们生成一些getset方法。这个是时候就要注意了。来看下生成的代码:

@Entitypublic class Point {    @Id    private Long id;    private Long strokeId;    private int x;    private int y;}@Entitypublic class Stroke {    @Id    private Long id;    private String name;    @ToMany(referencedJoinProperty = "strokeId")    private List
points;}

如上面,我们现在有每个笔画Stroke会有很多的Point。编译下之后会生成很多getset方法。

我们看下Stroke的一个get方法我们会看到下面这些代码。就由于这个代码。可能就会导致。我们解析到了Stroke后调用getPoints()方法想要获取点的集合是出现问题,这时候就可能会报错。这个时候我们可以在单独写另外的一个get方法,来支持直接获取points对象。

@Generated(hash = 404164872)    public List
getPoints() { if (points == null) { final DaoSession daoSession = this.daoSession; if (daoSession == null) { throw new DaoException("Entity is detached from DAO context"); } PointDao targetDao = daoSession.getPointDao(); List
pointsNew = targetDao._queryStroke_Points(id); synchronized (this) { if(points == null) { points = pointsNew; } } } return points; }

转载地址:http://mzzeo.baihongyu.com/

你可能感兴趣的文章
两列布局——但只用右浮动
查看>>
GNOME 网页浏览器 Epiphany 将要进行 5 项改进
查看>>
今年CES最大亮点:智能语音助手正成为新趋势
查看>>
Windows Mysql Server重启, log-bin路径配置
查看>>
刘剑锋:友云采助力企业数字化采购的新发展
查看>>
Rainbond 5.0.4 发布,做最好用的云应用操作系统
查看>>
亚马逊宣布与西云数据达成合作,旨在进一步扩大中国业务
查看>>
java nio的基础--缓冲区
查看>>
负载均衡沙龙活动第二期现场问答汇集
查看>>
GBDT原理及利用GBDT构造新的特征-Python实现
查看>>
Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(10)...
查看>>
【Xamarin.Forms】在XAML中传递参数
查看>>
关于数据仓库 — 总体工具介绍
查看>>
最大的错误是不敢犯错
查看>>
跟我学交换机配置(七)
查看>>
makefile 中 $@ $^ % 2015-04-11 18:02:36
查看>>
C#强化系列文章三:实验分析C#中三种计时器使用异同点
查看>>
Linux 进程间通信(一)
查看>>
通用对象池ObjectPool的一种简易设计和实现方案
查看>>
HTTP压缩仍让加密连接处于风险之中
查看>>