Android ORM系列之GreenDao关联关系映射
来源:互联网 发布:光子嫩肤永久有效知乎 编辑:程序博客网 时间:2024/05/19 21:41
上一篇文章对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 keywordorder.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");
这时候我们如果使用
Property pictureId = user.addLongProperty("pictureId").getProperty();Property thumbnailId = user.addLongProperty("thumbnailId").getProperty();user.addToOne(picture,pictureId);user.addToOne(picture,thumbnailId);
将会引起一个错误,因为User实体类中有两个引用指向Picture,但是如果不进行重命名的话这两个引用的名字就会是一样的,最终只会存在一个,为了解决这个问题,我们需要使用重载方法进行重命名
Property pictureId = user.addLongProperty("pictureId").getProperty();Property thumbnailId = user.addLongProperty("thumbnailId").getProperty();user.addToOne(picture,pictureId,"picture");user.addToOne(picture,thumbnailId,"thumbnail");
映射完成之后就是数据的增删改查了,具体内容参考上一篇博客。Android ORM系列之GreenDao最佳实践
源码下载
http://download.csdn.net/detail/sbsujjbcy/9070999
- Android ORM系列之GreenDao关联关系映射
- Android ORM系列之GreenDao关联关系映射
- ORM对象关系映射之GreenDAO建立多表关联
- ORM对象关系映射之GreenDAO建立多表关联
- 【Android】ORM数据库框架之GreenDao【关联】关系操作
- Android ORM系列之GreenDao最佳实践
- ORM对象关系映射之使用GreenDAO进行CRUD操作
- ORM对象关系映射之GreenDAO源码解析
- ORM对象关系映射之GreenDAO高级用法
- ORM对象关系映射之GreenDAO自定义属性转换器PropertyConverter
- ORM对象关系映射之使用GreenDAO进行CRUD操作
- android中ORM(对象关系映射)数据库greenDAO的使用
- Android ORM之greenDao
- Android ORM之GreenDao学习
- Android ORM 框架之 greenDAO
- Android ORM 框架之 greenDAO
- Android ORM 框架之 greenDAO
- Android ORM 框架之 greenDAO
- 你在过度测试你的软件吗?
- solr query
- Nouveau源码分析(零)
- web.xml中的url-pattern映射规则
- JSP - Directives
- Android ORM系列之GreenDao关联关系映射
- HDU 3746(Cyclic Nacklace)字符串匹配-KMP
- PAT 1075. PAT Judge (25)
- hdu 2899 Strange fuction 三分
- 浅谈深度学习(Deep Learning)的基本思想和方法
- handlebars-----另一种help的写法
- MultipartEntity上传文件时传递中文参数出现乱码的解决方案
- 信号处理程序中调用不可重入函数getpwnam 起结果是不可预见的。
- #include<list>