在设计一些比较复杂的数据库结构的时候,我们会遇到表之间是n:m的关系,就是常说的多对多的关系,最常用的情况,就是用户权限这块,日常最常见的就是学生与老师的关系了,哪么我们来看一下GreenDao中如何实现这层关系呢。

在GreenDao中其实是没有多对多这个关系,也就是它不支持这种关系,但是呢,我们可以自己去定义和设计一下。我们来看代码。

一,MyDaoGenerator.java文件中添加学生,老师,学生老师关联表

Entity studentBean = schema.addEntity("Students");
studentBean.implementsSerializable();
studentBean.addIdProperty();
studentBean.addStringProperty("stuName");
studentBean.addStringProperty("stuSex"); Entity teacherBean = schema.addEntity("Teachers");
teacherBean.implementsSerializable();
teacherBean.addIdProperty();
teacherBean.addStringProperty("teaName");
teacherBean.addStringProperty("teaSex"); Entity stuAndteaBean = schema.addEntity("stuAndtea");
Property studentId = stuAndteaBean.addLongProperty("studentId").getProperty();
Property teacherId = stuAndteaBean.addLongProperty("teacherId").getProperty(); //这里其实很简单,就是建立两个1:n的关系
stuAndteaBean.addToOne(studentBean,studentId).setName("onestu");
stuAndteaBean.addToOne(teacherBean,teacherId).setName("onetea");
studentBean.addToMany(stuAndteaBean,studentId).setName("manystu");
teacherBean.addToMany(stuAndteaBean,teacherId).setName("manytea");

很简单吧,来改一下版本号,Schema schema = new Schema(5, "greendao");

二,gradle面板运行MyDaoGenerator,生成相应的bean文件和操作dao文件

三,修改我们的THDevOpenHelper.java文件

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (oldVersion) {
case :
//创建新表,注意createTable()是静态方法
//infosDao.createTable(db, true);
//infoTypeDao.createTable(db,true);
//AreasDao.createTable(db,true); StudentsDao.createTable(db,true);
TeachersDao.createTable(db,true);
stuAndteaDao.createTable(db,true); // 加入新字段
// db.execSQL("ALTER TABLE 'moments' ADD 'audio_path' TEXT;"); // TODO
break;
}
}

四,测试一下我们的功能是不是好用,这里我就使用了,最简单的几行代码。

package com.example.cg.greendaolearn;  

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView; import com.example.cg.greendaolearn.db.DbService; import greendao.Students;
import greendao.Teachers;
import greendao.stuAndtea; public class manyActivity extends AppCompatActivity { private DbService db;
private TextView txt_many_info; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_many); db = DbService.getInstance(this); txt_many_info = (TextView)findViewById(R.id.txt_many_info); Students stu = new Students();
stu.setStuName("小明");
stu.setStuSex("男");
db.saveStudent(stu); Teachers tea = new Teachers();
tea.setTeaName("小何");
tea.setTeaSex("女");
db.saveTeacher(tea); stuAndtea st = new stuAndtea();
st.setStudentId(Long.parseLong(""));
st.setTeacherId(Long.parseLong(""));
db.saveStuAndTea(st); txt_many_info.setText(db.getStudentList().get().getStuName() + "--" +
db.getStudentList().get().getManystu().get().getOnetea().getTeaName());
}
}

运行结果,你会发现,我们把学生和老师都打印出来了

GreenDao的简单使用说明(五)多表n:m的更多相关文章

  1. Oracle 中 union 和union all 的简单使用说明

    1.刚刚工作不久,经常接触oracle,但是对oracle很多东西都不是很熟.今天我们来了解一下union和union all的简单使用说明.Union(union all): 指令的目的是将两个 S ...

  2. Django学习笔记(五)—— 表单

    疯狂的暑假学习之  Django学习笔记(五)-- 表单 參考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path         ...

  3. ORACLE 五种表的优缺点总结

    ORACLE 五种表的优缺点总结: 1.普通表(heap table):适合大部分设计场景,有长处也有缺点. 长处: a,语法简单方便 b,适合大部分场景 缺点: a,更新日志开销较大 b,Delet ...

  4. PHP简单利用token防止表单重复提交

    <?php /* * PHP简单利用token防止表单重复提交 * 此处理方法纯粹是为了给初学者参考 */ session_start(); function set_token() { $_S ...

  5. 简单的哈希表实现 C语言

    简单的哈希表实现 简单的哈希表实现 原理 哈希表和节点数据结构的定义 初始化和释放哈希表 哈希散列算法 辅助函数strDup 哈希表的插入和修改 哈希表中查找 哈希表元素的移除 哈希表打印 测试一下 ...

  6. struts 标签<s:ierator>的简单使用说明

    struts 标签<s:ierator>的简单使用说明,只显示<s:ierator> 的前6条数据 <s:iterator value="lstVisitor& ...

  7. 利用js的for循环实现一个简单的“九九乘法表”

    For循环九九乘法表 for循环是javascript中一种常用的循环语句,可以很好的解决在程序中需要重复执行某些语句,利用for循环实现简单的“九九乘法表”的效果: 让循环从小到大,依次排序,并计算 ...

  8. Spring依赖注入 --- 简单使用说明

    Spring依赖注入 --- 简单使用说明 本文将对spring依赖注入的使用做简单的说明,enjoy your time! 1.使用Spring提供的依赖注入 对spring依赖注入的实现方法感兴趣 ...

  9. PHP简单利用token防止表单重复提交(转)

    <?php/* * PHP简单利用token防止表单重复提交 */function set_token() { $_SESSION['token'] = md5(microtime(true)) ...

随机推荐

  1. javascript中原型链存在的问题

    我们知道使用原型链实现继承是一个goodway:)看个原型链继承的例子. function A () { this.abc = 44; } A.prototype.getAbc = function ...

  2. zk 09之:Curator之二:Path Cache监控zookeeper的node和path的状态

    在实际应用开发中,当某个ZNode发生变化后我们需要得到通知并做一些后续处理,Curator Recipes提供了Path Cache 来帮助我们轻松实现watch ZNode. Path Cache ...

  3. ASP.NET Core依赖注入解读&使用Autofac替代实现【转载】

    ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Autofac实现和自定义实现扩展方法 3.1 安装Autof ...

  4. HDU - 2962 Trucking SPFA+二分

    Trucking A certain local trucking company would like to transport some goods on a cargo truck from o ...

  5. 组合外键(FOREIGN KEY)

    一张表,它的外键即是参考另一张表的主键,但这些关联键是组合键,由2列或多列组成. 你可以先看看这篇<多列组合为主键(PRIMARY KEY)>https://www.cnblogs.com ...

  6. ai技术体系

  7. LibreOJ #2036. 「SHOI2015」自动刷题机

    #2036. 「SHOI2015」自动刷题机 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 题目描述 曾经发明了信号增幅仪的发明家 SHTSC 又公开 ...

  8. js中的原型以及原型链

    在js中原型是每个构造函数的属性: 这个算 js 核心概念的一部分 var f1 = new Foo(); 对象 f1 的构造函数就是 Foo , f1的原型 __proto__ 就指向构造函数 Fo ...

  9. 坑爹的 Java 可变参数,把我整得够惨。。

    最近在写一个功能点,用了 Java 中的可变参数,真是把我搞得够惨.. 什么是可变参数? 就是方法参数用 Object... args 三个点形式,一个参数可以接收多个参数. 实际的代码就不帖了,来看 ...

  10. C# Dictionary类型转json方法之一

    using Newtonsoft.Json;//引用命名空间 Dictionary<string, string> Content = new Dictionary<string, ...