Android ORM系列之GreenDao关联关系映射
2016-01-21 12:16
344 查看
上一篇文章对greenDao有一个整体的把握 Android ORM系列之GreenDao最佳实践。这篇文章将重点介绍GreenDao的关联关系的映射以及实体类的生成。
在GreenDao中,实体类的生成是通过Entity类来进行的,可以说一个Entity对象对应一个实体类。实体类中的属性可以通过Entity对象的方法进行添加,GreenDao会根据我们添加的属性自动生成实体类。我们可以通过一系列方法进行操作。
可以自定义一张表的表名
entity.setTableName(test);
如果你要为一个实体类添加一个id,则可以使用
entity.addIdProperty()
添加一个主键,并且自增
entity.addLongProperty(num).primaryKey().autoincrement();
你可以通过下面的一些列方法增加一个对应类型的字段
entity.addShortProperty(); entity.addIntProperty(); entity.addFloatProperty(); entity.addDoubleProperty(); entity.addLongProperty(); entity.addStringProperty();
entity.addBooleanProperty(); entity.addByteProperty(); entity.addDateProperty(); entity.addByteArrayProperty();
当然你也可以修改列名
entity.addIntProperty().columnName();
表中会有一些约束条件,可以指定字段为主键,非空,唯一,也可以指定索引。
entity.addIntProperty().isPrimaryKey() entity.addStringProperty().notNull(); entity.addIntProperty().unique(); entity.addLongProperty().index();
可以让实体类实现接口,继承父类,导入包
entity.implementsSerializable(); entity.implementsInterface(com.test.A); entity.setSuperclass(com.test.B); entity.addImport(com.test.B);
如果你想自己添加一些引入包,字段,方法,但是不希望重新生成的时候被覆盖掉
你可以这么做
首先调用下面这个方法。
schema.enableKeepSectionsByDefault();
之后在之指定的块之间添加代码。
// KEEP INCLUDES - put your custom includes here 添加引入 // KEEP INCLUDES END // KEEP FIELDS - put your custom fields here 添加字段 // KEEP FIELDS END // KEEP METHODS
- put your custom methods here 添加方法 // KEEP METHODS END
添加完成后你重写生成实体类,这三部分之间的内容会被保留
如果你需要ContentProvider的支持,则添加以下代码
entity.addContentProvider();
之后会自动生成一个ContentProvider
GreenDao对实体类的关联关系也是支持的很好的。
我们知道,一个人有一张身份证,一张身份证对应一个人,这两者的关系是一对一。下面我们生成这两个实体类,并进行一对一映射。
一个人有一些属性
Entity person = schema.addEntity(Person); person.addIdProperty().primaryKey(); person.addStringProperty(name); person.addDoubleProperty(height); person.addDoubleProperty(weight);
身份证上有身份证号和地址等信息
Entity card = schema.addEntity(Card); card.addIdProperty().primaryKey(); card.addStringProperty(num); card.addStringProperty(address);
之后我们通过addToOne方法进行映射
Property idcardPK = person.addLongProperty(cardId).getProperty(); person.addToOne(card, idcardPK); Property personPK = card.addLongProperty(personId).getProperty();
card.addToOne(person, personPK);
接下来来看一对多映射。在淘宝上购物,一个顾客可能会有多个订单,但是一个订单只属于一个顾客。顾客对订单是一对多,订单对顾客是多对一。
随意在顾客与订单实体类上增加几个属性。
Entity customer = schema.addEntity(Customer); customer.addIdProperty(); customer.addStringProperty(name); customer.addDoubleProperty(money); Entity order =
schema.addEntity(Order); order.setTableName(Orders); // ORDER is a reserved keyword order.addIdProperty(); order.addStringProperty(num); order.addDoubleProperty(desc);
进行关系映射
Property customerId = order.addLongProperty(customerId).getProperty(); customer.addToMany(order,customerId).setName(orders); order.addToOne(customer,customerId);
还有更复杂的关系就是多对多了,我们知道学生选课系统中,一个学生可以选多门课,一门课可以被多个学生选,这个关系是多对多的。
下面是学生和课程的实体类
Entity student = schema.addEntity(Student); student.addIdProperty(); student.addStringProperty(studentName).notNull(); student.addIntProperty(studentAge);
student.addDateProperty(studentBirth); student.addBooleanProperty(studentSex); Entity course = schema.addEntity(Course); course.addIdProperty(); course.addStringProperty(courseName).notNull(); course.addStringProperty(courseDesc); course.addIntProperty(courseTimes);
course.addDoubleProperty(courseCredit);
多对多的映射我们是通过第三张表来完成的
Entity sc = schema.addEntity(StudentCourse); Property studentId = sc.addLongProperty(studentId).getProperty(); Property courseId = sc.addLongProperty(courseId).getProperty();
sc.addToOne(student,studentId); sc.addToOne(course, courseId); student.addToMany(sc, studentId); course.addToMany(sc,studentId);
此外,还有一种树形结构的表映射,比如一个树形菜单,一级菜单下有二级菜单,二级菜单下有三级菜单,但是这些菜单的对象都是同一个类的对象。一个菜单有很多子菜单,但只有一个父菜单。
Entity treeEntity = schema.addEntity(Node); treeEntity.addIdProperty(); treeEntity.addStringProperty(name); Property parentIdProperty = treeEntity.addLongProperty(parentId).getProperty();
treeEntity.addToOne(treeEntity, parentIdProperty).setName(parent); treeEntity.addToMany(treeEntity, parentIdProperty).setName(children);
有时候,一张表中可能会有另一张表的两个外键,比如一个用户有头像,还有头像的缩略图,但是这两张图都是图像表中的。
Entity picture = schema.addEntity(Picture); picture.addIdProperty().autoincrement(); picture.addStringProperty(url); Entity user = schema.addEntity(User);
user.addIdProperty(); user.addStringProperty(account);
在GreenDao中,实体类的生成是通过Entity类来进行的,可以说一个Entity对象对应一个实体类。实体类中的属性可以通过Entity对象的方法进行添加,GreenDao会根据我们添加的属性自动生成实体类。我们可以通过一系列方法进行操作。
可以自定义一张表的表名
entity.setTableName(test);
如果你要为一个实体类添加一个id,则可以使用
entity.addIdProperty()
添加一个主键,并且自增
entity.addLongProperty(num).primaryKey().autoincrement();
你可以通过下面的一些列方法增加一个对应类型的字段
entity.addShortProperty(); entity.addIntProperty(); entity.addFloatProperty(); entity.addDoubleProperty(); entity.addLongProperty(); entity.addStringProperty();
entity.addBooleanProperty(); entity.addByteProperty(); entity.addDateProperty(); entity.addByteArrayProperty();
当然你也可以修改列名
entity.addIntProperty().columnName();
表中会有一些约束条件,可以指定字段为主键,非空,唯一,也可以指定索引。
entity.addIntProperty().isPrimaryKey() entity.addStringProperty().notNull(); entity.addIntProperty().unique(); entity.addLongProperty().index();
可以让实体类实现接口,继承父类,导入包
entity.implementsSerializable(); entity.implementsInterface(com.test.A); entity.setSuperclass(com.test.B); entity.addImport(com.test.B);
如果你想自己添加一些引入包,字段,方法,但是不希望重新生成的时候被覆盖掉
你可以这么做
首先调用下面这个方法。
schema.enableKeepSectionsByDefault();
之后在之指定的块之间添加代码。
// KEEP INCLUDES - put your custom includes here 添加引入 // KEEP INCLUDES END // KEEP FIELDS - put your custom fields here 添加字段 // KEEP FIELDS END // KEEP METHODS
- put your custom methods here 添加方法 // KEEP METHODS END
添加完成后你重写生成实体类,这三部分之间的内容会被保留
如果你需要ContentProvider的支持,则添加以下代码
entity.addContentProvider();
之后会自动生成一个ContentProvider
GreenDao对实体类的关联关系也是支持的很好的。
我们知道,一个人有一张身份证,一张身份证对应一个人,这两者的关系是一对一。下面我们生成这两个实体类,并进行一对一映射。
一个人有一些属性
Entity person = schema.addEntity(Person); person.addIdProperty().primaryKey(); person.addStringProperty(name); person.addDoubleProperty(height); person.addDoubleProperty(weight);
身份证上有身份证号和地址等信息
Entity card = schema.addEntity(Card); card.addIdProperty().primaryKey(); card.addStringProperty(num); card.addStringProperty(address);
之后我们通过addToOne方法进行映射
Property idcardPK = person.addLongProperty(cardId).getProperty(); person.addToOne(card, idcardPK); Property personPK = card.addLongProperty(personId).getProperty();
card.addToOne(person, personPK);
接下来来看一对多映射。在淘宝上购物,一个顾客可能会有多个订单,但是一个订单只属于一个顾客。顾客对订单是一对多,订单对顾客是多对一。
随意在顾客与订单实体类上增加几个属性。
Entity customer = schema.addEntity(Customer); customer.addIdProperty(); customer.addStringProperty(name); customer.addDoubleProperty(money); Entity order =
schema.addEntity(Order); order.setTableName(Orders); // ORDER is a reserved keyword order.addIdProperty(); order.addStringProperty(num); order.addDoubleProperty(desc);
进行关系映射
Property customerId = order.addLongProperty(customerId).getProperty(); customer.addToMany(order,customerId).setName(orders); order.addToOne(customer,customerId);
还有更复杂的关系就是多对多了,我们知道学生选课系统中,一个学生可以选多门课,一门课可以被多个学生选,这个关系是多对多的。
下面是学生和课程的实体类
Entity student = schema.addEntity(Student); student.addIdProperty(); student.addStringProperty(studentName).notNull(); student.addIntProperty(studentAge);
student.addDateProperty(studentBirth); student.addBooleanProperty(studentSex); Entity course = schema.addEntity(Course); course.addIdProperty(); course.addStringProperty(courseName).notNull(); course.addStringProperty(courseDesc); course.addIntProperty(courseTimes);
course.addDoubleProperty(courseCredit);
多对多的映射我们是通过第三张表来完成的
Entity sc = schema.addEntity(StudentCourse); Property studentId = sc.addLongProperty(studentId).getProperty(); Property courseId = sc.addLongProperty(courseId).getProperty();
sc.addToOne(student,studentId); sc.addToOne(course, courseId); student.addToMany(sc, studentId); course.addToMany(sc,studentId);
此外,还有一种树形结构的表映射,比如一个树形菜单,一级菜单下有二级菜单,二级菜单下有三级菜单,但是这些菜单的对象都是同一个类的对象。一个菜单有很多子菜单,但只有一个父菜单。
Entity treeEntity = schema.addEntity(Node); treeEntity.addIdProperty(); treeEntity.addStringProperty(name); Property parentIdProperty = treeEntity.addLongProperty(parentId).getProperty();
treeEntity.addToOne(treeEntity, parentIdProperty).setName(parent); treeEntity.addToMany(treeEntity, parentIdProperty).setName(children);
有时候,一张表中可能会有另一张表的两个外键,比如一个用户有头像,还有头像的缩略图,但是这两张图都是图像表中的。
Entity picture = schema.addEntity(Picture); picture.addIdProperty().autoincrement(); picture.addStringProperty(url); Entity user = schema.addEntity(User);
user.addIdProperty(); user.addStringProperty(account);
相关文章推荐
- 笔记:Android ListView 的Item点击不变色
- Android -下拉刷新,ViewPager和ScrollView嵌套滚动问题解决方案
- 阿冰教你一步一步做Android新闻客户端(二)两种异步线程加载图片的方法
- android安卓屏蔽禁用系统输入法,自定义软键盘,解决EditText光标问题demo
- Android Parcelable和Serializable的区别
- android 通过字符串来获取R下面资源的ID 值
- 【Android 基础】Animation 动画介绍和实现
- Android基础Activity初步了解
- Android拨打电话(Intent.ACTION.CALL)
- Android Studio中JNI -- 2 -- 编写c文件
- 深入android6.0 设备 idle状态
- Android6.0 设备Idle状态(二)AlarmManagerService setIdleUntil接口
- [Androd初级]解决Listview的子项Item的高度无法设置的情节
- Android性能优化典范
- Android之TextView实现文字过长时省略部分或者滚动显示
- android 部分 FLAG释义
- Android 二:root 手机的原理
- Android开发中无处不在的设计模式——动态代理模式
- Android 一:通过adb命令判断手机是否被root过
- Android PopupWindow 疑难杂症之宽度WRAP_CONTENT