标签:
上一篇我们介绍了greendao的基本使用方法,如果您还不了解,建议先看下上篇文章再来看这篇会有更好的效果。今天我们来继续学习greendao的relation部分,即数据表的关联操作部分,greendao默认支持一对一,一对多的关系操作,多对多目前暂不支持,下面我们来一步步实现greendao的关联操作;
/**
* <男人表>
*/
Entity man = schema.addEntity("Man");
// 设置表名
man.setTableName("man");
// 身份证号
man.addStringProperty("cardManNum").columnName("cardmannum").primaryKey();
// 姓名
man.addStringProperty("name").columnName("name");
// 年龄
man.addIntProperty("age").columnName("age");
// 家庭住址
man.addStringProperty("address").columnName("address");
/**
* <女人表>
*/
Entity woman = schema.addEntity("Woman");
// 设置表名
woman.setTableName("woman");
// 身份证号
woman.addStringProperty("cardWomanNum").columnName("cardwomannum").primaryKey();
// 姓名
woman.addStringProperty("name").columnName("name");
// 性别
woman.addStringProperty("sex").columnName("sex");
// 年龄
woman.addIntProperty("age").columnName("age");
// 家庭住址
woman.addStringProperty("address").columnName("address");
/**
* <一对一映射>
*/
// 在woman表中插入外键(man表的主键)进行关联
Property cardnum = man.addStringProperty("fkmannum").getProperty();
man.addToOne(woman, cardnum);
// 在man表中插入外键(woman表的主键)进行关联
Property womanCardNum = woman.addStringProperty("fkwomannum").getProperty();
woman.addToOne(man, womanCardNum);
man表:
women表:
ManDao manDao = DBController.getDaoSession().getManDao();
Man man = manDao.queryBuilder().where(ManDao.Properties.Name.eq("张三")).list().get(0);
if (null != man)
{
//我们通过man的getWomen()方法可以直接拿到多对应的women对象
showDbData("张三的媳妇是:"+man.getWoman().getName());
}
/**
* 顾客
*/
Entity customer = schema.addEntity("Customer");
// 设置表名
customer.setTableName("customer");
// customerId设置为主键
customer.addLongProperty("customerId").primaryKey();
customer.addStringProperty("name").columnName("name").notNull();
/**
* 订单
*/
Entity orderinfo = schema.addEntity("OrderInfo");
// 设置表名
orderinfo.setTableName("orderinfo");
// 身份证号码设置为主键
orderinfo.addLongProperty("orderId").primaryKey();
orderinfo.addDoubleProperty("money").notNull();
/**
* 一对多关联
*
* 当设置了顾客对订单一对多关联后,Order实体(和表)中会多一个属性为customerId,
* 所以通过订单我们可以得到该顾客信息,而Customer实体(和表)中会多一个List集合变量:
* List<Order> orders,表示该顾客的所有订单,其中orders其实是我们自定义的名字,
* 在刚刚setName("orders")就是给这个变量设置了“orders“名称,
* 而Customer实体中还提供了一个方法getOrders()表示得到该顾客所有订单
*
*/
Property property = orderinfo.addLongProperty("customerId").getProperty();
// 一个订单对应一个顾客
orderinfo.addToOne(customer, property, "customerfk");
customer.addToMany(orderinfo, property).setName("orders");
Customer表:
OrderInfo表:
CustomerDao customerDao = DBController.getDaoSession().getCustomerDao();
Customer customer = customerDao.queryBuilder().where(CustomerDao.Properties.Name.eq("李四")).list().get(0);
if (null != customer)
{
StringBuilder builder = new StringBuilder();
// 通过customer拿到所有订单信息
List<OrderInfo> orderInfos = customer.getOrders();
for (int i = 0; i < orderInfos.size(); i++)
{
builder.append("---" + orderInfos.get(i).getMoney() + "\n");
}
showDbData(builder.toString());
}
// 学生
Entity student = schema.addEntity("Student");
student.addLongProperty("studentId").primaryKey();
student.addStringProperty("name").notNull();
// 课程
Entity course = schema.addEntity("Course");
course.addLongProperty("courseId").primaryKey();
course.addStringProperty("courseName").notNull();
// 建立多对多关系,StudentCourse中间表,简化多对多的关系
Entity studentCourse = schema.addEntity("StudentCourse");
studentCourse.addIdProperty().primaryKey();
Property studentId = studentCourse.addLongProperty("studentId").getProperty();
Property courseId = studentCourse.addLongProperty("courseId").getProperty();
// StudentCourse表分别与student和course表建立一对多关系,实现student和course的多对多
studentCourse.addToOne(student, studentId);
studentCourse.addToOne(course, courseId);
student.addToMany(studentCourse, studentId);
course.addToMany(studentCourse, courseId);
Student表:
Course表:
StudentCourse表:
StudentDao studentDao = DBController.getDaoSession().getStudentDao();
List<Student> students = studentDao.queryBuilder().where(StudentDao.Properties.Name.eq("老王")).list();
StringBuilder builder = new StringBuilder();
Student student = students.get(0);
List<StudentCourse> studentCourses = student.getStudentCourseList();
for (int i = 0; i < studentCourses.size(); i++)
{
StudentCourse studentCourse = studentCourses.get(i);
Course course = studentCourse.getCourse();
builder.append("----课程:" + course.getCourseName() + "----课程ID:" + course.getCourseId());
builder.append("\n");
}
showDbData(builder.toString());
伴随着新接口PropertyConverter的出现,greendao的实体不再局限于原始的类型,如整数,字符串,日期和布尔值。通过实现PropertyConverter接口,可以定义从实体值到数据库中的值的转换。这个功能虽然简单,但是确非常的强大,保证了充分的灵活性。下面我们就来演示一下json字符串和json对象的转化,我们在数据库中存储json字符串,经过转换后直接查询出实体类的对象:
public class PersonModel implements Serializable
{
private String name;
private String age;
public PersonModel(String name, String age)
{
super();
this.name = name;
this.age = age;
}
public PersonModel()
{
super();
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getAge()
{
return age;
}
public void setAge(String age)
{
this.age = age;
}
@Override
public String toString()
{
return "PersonModel [name=" + name + ", age=" + age + "]";
}
}
/**
*
* 自定义数据库类型
*
* Json
*/
public class JsonPropertyConverter implements PropertyConverter<PersonModel, String>
{
// 从数据库取出值后转为实体类里的类型
@Override
public PersonModel convertToEntityProperty(String databaseValue)
{
Gson gson = new Gson();
PersonModel model = gson.fromJson(databaseValue, PersonModel.class);
return model;
}
// 转换实体类该字段对应的数据库所存放的值
@Override
public String convertToDatabaseValue(PersonModel entityProperty)
{
Gson gson = new Gson();
return gson.toJson(entityProperty);
}
}
/**
* 添加自定义属性
* 此处用的gson解析
* @param schema
* @see [类、类#方法、类#成员]
*/
private static void addPropertyConverter(Schema schema)
{
Entity item = schema.addEntity("JsonTable");
item.addIdProperty().primaryKey();
//第一个参数是我们转换后的类型的全路径,第二个是转化器类的路径
item.addStringProperty("model").customType("com.relation.dao.PersonModel", "com.relation.dao.JsonPropertyConverter");
}
JsonTableDao jsonTableDao = DBController.getDaoSession().getJsonTableDao();
JsonTable jsonTable = new JsonTable();
PersonModel model = new PersonModel();
model.setName("周星驰");
model.setAge("45");
jsonTable.setModel(model);
jsonTableDao.insertInTx(jsonTable);
JsonTableDao jsonTableDao = DBController.getDaoSession().getJsonTableDao();
JsonTable jsonTable = jsonTableDao.queryBuilder().where(JsonTableDao.Properties.Id.eq(1)).unique();
PersonModel model = jsonTable.getModel();
showDbData(model.toString());
到此本篇介绍基本完成,有疑问欢迎留言交流讨论!
【Android】ORM数据库框架之GreenDao【关联】关系操作
标签:
原文地址:http://blog.csdn.net/wangkeke1860/article/details/51934058