Android Room数据库多表查询的使用实例

Android-Room数据库(介绍)

前言

在SQLite数据库中,我们可以指定对象之间的关系,因此我们可以将一个或多个对象与一个或多个其他对象绑定。这就是所谓的一对多和多对多的关系。

既然要多表查询,所以表之间就得有关联。这时候我们就得使用新的注解符@ForeignKey

接下来的内容,就需要上节的内容了

@Entity
public class Company {
  @PrimaryKey(autoGenerate = true)
  private int id;
  private String name;
  private int age;
  private String address;
  private double salary;

  public Company(String name, int age, String address, double salary) {
    this.name = name;
    this.age = age;
    this.address = address;
    this.salary = salary;
  }
  //省略了getter/setter方法
}

下面我们再新建一个与之关联的表

@Entity(foreignKeys = @ForeignKey(entity = Company.class,parentColumns = "id",childColumns = "emp_id",onDelete = CASCADE),
    indices = @Index(value={"emp_id"},unique = true))
public class Department {
  @PrimaryKey(autoGenerate = true)
  private int id;
  private String dept;
  @ColumnInfo(name = "emp_id")
  private int empId;

  public Department(String dept, int empId) {
    this.dept = dept;
    this.empId = empId;
  }
  //省略了getter/setter方法
}

这里我使用了@ForeignKey关联了company表,主键id,外键emp_id,紧接着使用了indices创建了唯一索引。

下面就是创建Dao

@Dao
public interface CompanyDao {
  @Query("SELECT * FROM company")
  List<Company> getAllCompany();
}
@Dao
public interface DepartmentDao {
  @Query("SELECT * FROM department")
  List<Department> getAllDepartment();
  //使用内连接查询
  @Query("SELECT emp_id,name,dept from company INNER JOIN department ON Company.id=Department.emp_id")
  List<InnerJoinResult> getDepartmentFromCompany();
}

最后就是创建Database

@Database(entities = {Department.class, Company.class}, version = 1, exportSchema = false)
public abstract class DepartmentDatabase extends RoomDatabase {
  public static final String DB_NAME = "CompanyDatabase.db";
  private static volatile DepartmentDatabase instance;

  public static synchronized DepartmentDatabase getInstance(Context context) {
    if (instance == null) {
      instance = create(context);
    }
    return instance;
  }

  private static DepartmentDatabase create(final Context context) {
    return Room.databaseBuilder(
        context,
        DepartmentDatabase.class,
        DB_NAME).allowMainThreadQueries().build();
  }

  public abstract DepartmentDao getDepartmentDao();

  public abstract CompanyDao getCompanyDao();
}

这里我想大家经过之前的文章介绍都很熟悉了吧。这里就不多解释了,不记得的,请看之前的文章。

具体使用

    List<Company> list = new ArrayList<>();
    Company company = new Company("Paul",32,"California",20000.0);
    list.add(company);
    company = new Company("Allen",25,"Texas",15000.0);
    list.add(company);
    company = new Company("Teddy",23,"Norway",20000.0);
    list.add(company);
    company = new Company("Mark",25,"Rich-Mond",65000.0);
    list.add(company);
    company = new Company("David",27,"Texas",85000.0);
    list.add(company);
    company = new Company("Kim",22,"South-Hall",45000.0);
    list.add(company);
    company = new Company("James",24,"Houston",10000.0);
    list.add(company);

    List<Department> departmentList = new ArrayList<>();
    Department department = new Department("IT Billing",1);
    departmentList.add(department);
    department = new Department("Engineerin",2);
    departmentList.add(department);
    department = new Department("Finance",7);
    departmentList.add(department);

    DepartmentDatabase.getInstance(this)
    .getCompanyDao().insert(list);

    DepartmentDatabase.getInstance(this)
        .getDepartmentDao().insert(departmentList);

这样我们就把需要的数据插入到数据库了,下面我们查询一下,看看有没有插入成功。

查询代码如下:

   List<Company> company = DepartmentDatabase.getInstance(this).getCompanyDao().getAllCompany();
   LogUtil.debug("Company----->" + company.size());
   for (Company result : company) {
      LogUtil.debug("result--->" + result.getName() + " " + result.getAge()+" "+result.getAddress()+" "+result.getSalary());
   }
   List<Department> department = DepartmentDatabase.getInstance(this).getDepartmentDao().getAllDepartment();
   LogUtil.debug("Department----->" + department.size());
   for (Department result : department) {
       LogUtil.debug("result--->" + result.getDept() + " " + result.getEmpId());
   }

这样看来是插入成功了的。。。

好了,下面我们要开始连表查询了。

当我们查询的时候,我们就会遇到一个问题,那就是我们关联两个表查询后的字段是company和departemnt组合之后的。所以这里我们又需要去再次创建一个Model类。

public class InnerJoinResult {
  @ColumnInfo(name="emp_id")
  private int empId;
  private String name;
  private String dept;
  //这里同样省略了getter/setter方法
}

因为上面我们已经将查询方法写好了,直接调用即可。

 List<InnerJoinResult> company1 = DepartmentDatabase.getInstance(this).getDepartmentDao().getDepartmentFromCompany();
 LogUtil.debug("InnerJoinResult----->" + company1.size());
 for (InnerJoinResult result : company1) {
    LogUtil.debug("result--->" + result.getEmpId() + " " + result.getName() + " " + result.getDept());
 }

查询结果如下,说明我们多表查询成功了:

到这里,多表查询就结束了。后续还会继续更新。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • 详细介绍Android-Room数据库的使用
(0)

相关推荐

  • 详细介绍Android-Room数据库的使用

    前言 Google终于发布了一个和SQLite相关的库了.之前一直都是在SQLite.XUtils.greenDao.Realm这些数据库之间来回折腾.现在终于有一个更"正统"数据库了. Room是什么? Room是一个持久性数据库. Room持久性库提供了SQLite的抽象层,以便在充分利用SQLite的同时允许流畅的数据库访问. 为什么会选择Room? 前面我也说到了现在也有不少开源的数据库给大家使用,那为什么我们还要去学习使用这个库呢?当然不是我前面说的"正不正统&qu

  • Android Room数据库多表查询的使用实例

    Android-Room数据库(介绍) 前言 在SQLite数据库中,我们可以指定对象之间的关系,因此我们可以将一个或多个对象与一个或多个其他对象绑定.这就是所谓的一对多和多对多的关系. 既然要多表查询,所以表之间就得有关联.这时候我们就得使用新的注解符@ForeignKey 接下来的内容,就需要上节的内容了 @Entity public class Company { @PrimaryKey(autoGenerate = true) private int id; private String

  • python如何解析复杂sql,实现数据库和表的提取的实例剖析

    需求: 公司的数据分析师,提交一个sql, 一般都三四百行.由于数据安全的需要,不能开放所有的数据库和数据表给数据分析师查询,所以需要解析sql中的数据库和表,与权限管理系统中记录的数据库和表权限信息比对,实现非法查询的拦截. 解决办法: 在解决这个问题前,现在github找了一下轮子,发现python下面除了sql parse没什么好的解析数据库和表的轮轮.到是在java里面找到presto-parser解析的比较准.于是自己结合sql parse源码写了个类,供大家参考,测试了一下,检测还是

  • MySQL多表查询的具体实例

    一 使用SELECT子句进行多表查询 SELECT 字段名 FROM 表1,表2 - WHERE 表1.字段 = 表2.字段 AND 其它查询条件 SELECT a.id,a.name,a.address,a.date,b.math,b.english,b.chinese FROM tb_demo065_tel AS b,tb_demo065 AS a WHERE a.id=b.id 注:在上面的的代码中,以两张表的id字段信息相同作为条件建立两表关联,但在实际开发中不应该这样使用,最好用主外键

  • MySql数据库单表查询与多表连接查询效率对比

    这段时间在做项目的过程中,遇到一个模块,数据之间的联系很复杂,在建表的时候就很纠结,到底该怎么去处理这些复杂的数据呢,是单表查询,然后在业务层去处理数据间的关系,还是直接通过多表连接查询来处理数据关系呢? 通过查阅资料和阅读博客,有以下两个回答: 一.<高性能mysql>中的回答 很多高性能的应用都会对关联查询进行分解.简单地,可以对每个表进行一次单表查询,然后将结果在应用程序中进行关联.例如,下面这个查询: select * from tag join tag_post on tag_pos

  • 详解MySQL数据库--多表查询--内连接,外连接,子查询,相关子查询

    多表查询 使用单个select 语句从多个表格中取出相关的查询结果,多表连接通常是建立在有相互关系的父子表上; 1交叉连接 第一个表格的所有行 乘以 第二个表格中的所有行,也就是笛卡尔积 创建一个消费者与顾客的表格: 代码如下: -- create table customers( -- id int primary key auto_increment, -- name VARCHAR(20)not null, -- address VARCHAR(20)not NULL -- ); -- C

  • Android+SQLite数据库实现的生词记事本功能实例

    本文实例讲述了Android+SQLite数据库实现的生词记事本功能.分享给大家供大家参考,具体如下: 主activity命名为 Dict: 代码如下: package example.com.myapplication; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase;

  • MySQL单表查询常见操作实例总结

    本文实例总结了MySQL单表查询常见操作.分享给大家供大家参考,具体如下: 创建fruits表: CREATE TABLE fruits ( f_id char(10) NOT NULL, s_id INT NOT NULL, f_name char(255) NOT NULL, f_price decimal(8,2) NOT NULL, PRIMARY KEY(f_id) ) ; INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES(

  • MyBatis-Plus实现连表查询的方法实例

    目录 使用方法 安装 使用 核心类 MPJLambdaWrapper和MPJQueryWrapper MPJLambdaWrapper用法 MPJQueryWrapper 总结 mybatis-plus-join gitee github 使用方法 安装 在项目中添加依赖 <dependency> <groupId>com.github.yulichang</groupId> <artifactId>mybatis-plus-join</artifac

  • java 查询oracle数据库所有表DatabaseMetaData的用法(详解)

    一 . 得到这个对象的实例 Connection con ; con = DriverManager.getConnection(url,userName,password); DatabaseMetaData dbmd = con.getMetaData(); 二. 方法getTables的用法 原型: ResultSet DatabaseMetaData.getTables(String catalog,String schema,String tableName,String []type

  • asp.net实现的MVC跨数据库多表联合动态条件查询功能示例

    本文实例讲述了asp.net实现的MVC跨数据库多表联合动态条件查询功能.分享给大家供大家参考,具体如下: 一.控制器中方法 [HttpGet] public ActionResult Search() { ViewBag.HeadTitle = "搜索"; ViewBag.MetaKey = "\"123\""; ViewBag.MetaDes = "\"456\""; string whereText

随机推荐