greendao创建关联表的数据库

参考:http://www.doc88.com/p-538467175318.html

在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对实体类的关联关系也是支持的很好的。

例如:
1.两张表一对一:
我们知道,一个人有一张身份证,一张身份证对应一个人,这两者的关系是一对一。下面我们生成这两个实体类,并进行一对一映射。

一个人的一些属性

 Entity person = schema.addEntity("Person");
 //id为person的主键
        Property idcardPK = person.addIdProperty().getProperty();
        person.addStringProperty("name");
        person.addDoubleProperty("height");
        person.addDoubleProperty("weight");

身份证的一些属性:

Entity card = schema.addEntity("Card");
//id为card表的主键
        Property personPK = card.addIdProperty().getProperty();
        card.addStringProperty("num");
        card.addStringProperty("address");

之后我们通过addToOne的方法进行映射

//id即为card表中的主键id,作为card表的外键存在于person表中,用于索引card表的记录
 person.addToOne(card, idcardPK);
 //id即为person表中的主键id,作为person表的外键存在于card表中,用于索引card表的记录
 card.addToOne(person,personPK);

2.一对多
接下来来看一对多映射。在淘宝上购物,一个顾客可能会有多个订单,但是一个订单只属于一个顾客。顾客对订单是一对多,订单对顾客是多对一。
随意在顾客与订单实体类上增加几个属性。

Entity customer = schema.addEntity(Customer);
//id作为customer的主键
Property pc=customer.addIdProperty().getProperty();
customer.addStringProperty(name);
customer.addDoubleProperty(money);

Entity order = schema.addEntity(Order);
order.setTableName(Orders);
//id作为order的主键
order.addIdProperty();
order.addStringProperty(num);
order.addDoubleProperty(desc);

进行关系映射

Property p=order.addLongProperty("customerId").getProperty();
//将customer表中的主键id(pc)映射到order表中的customerId(p)上
customer.addToMany(pc,order,p).setName("orders");
//customerId为customer在order表中的外键
order.addToOne(customer,p);

3、多对多

还有更复杂的关系就是多对多了,我们知道学生选课系统中,一个学生可以选多门课,一门课可以被多个学生选,这个关系是多对多的。
下面是学生和课程的实体类:

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);
下面是一个使用 GreenDAO 实现多关联的示例: 假设有两个实体类 User 和 Order,一个用户可以有多个订单,一个订单只属于一个用户,因此可以使用一对多的关系进行关联。 首先,定义 User 实体类: ```java @Entity public class User { @Id(autoincrement = true) private Long id; private String name; @ToMany(referencedJoinProperty = "userId") private List<Order> orders; // 省略 getter 和 setter 方法 } ``` 其中,使用 `@ToMany` 注解示一个用户可以有多个订单,`referencedJoinProperty` 参数指定了 Order 实体类中与 User 实体类关联的字段。 接着,定义 Order 实体类: ```java @Entity public class Order { @Id(autoincrement = true) private Long id; private String orderName; private Long userId; @ToOne(joinProperty = "userId") private User user; // 省略 getter 和 setter 方法 } ``` 其中,使用 `@ToOne` 注解示一个订单只属于一个用户,`joinProperty` 参数指定了 Order 实体类中与 User 实体类关联的字段。 然后,创建 GreenDAO 的生成代码(可通过 Android Studio 中的 Gradle 插件自动生成)。 最后,就可以通过 GreenDAO 提供的 API 对 User 和 Order 实体进行操作,例如: ```java // 新增一个用户和一个订单 User user = new User(); user.setName("张三"); userDao.insert(user); Order order = new Order(); order.setOrderName("订单1"); order.setUserId(user.getId()); orderDao.insert(order); // 查询一个用户及其所有订单 User user = userDao.queryBuilder() .where(UserDao.Properties.Id.eq(userId)) .build() .unique(); List<Order> orders = user.getOrders(); ``` 以上示例演示了如何使用 GreenDAO 实现多关联。需要注意的是,在定义实体类时,需要使用 GreenDAO 提供的注解进行标注,并且需要在实体类中定义与关联实体类的关联字段。在使用 API 操作实体类时,可以通过关联字段进行关联查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值