Android ORM系列之GreenDao关联关系映射

上一篇文章对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");

这时候我们如果使用

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

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值