热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

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

这篇文章主要介绍了AndroidRoom数据库多表查询的使用实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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 getAllCompany();
}
@Dao
public interface DepartmentDao {
  @Query("SELECT * FROM department")
  List getAllDepartment();
  //使用内连接查询
  @Query("SELECT emp_id,name,dept from company INNER JOIN department ON Company.id=Department.emp_id")
  List 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 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 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 = 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 = 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 company1 = DepartmentDatabase.getInstance(this).getDepartmentDao().getDepartmentFromCompany();
 LogUtil.debug("InnerJoinResult----->" + company1.size());
 for (InnerJoinResult result : company1) {
    LogUtil.debug("result--->" + result.getEmpId() + " " + result.getName() + " " + result.getDept());
 }

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

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

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


推荐阅读
  • 本文探讨了如何利用 Hibernate 进行高效的批量更新和删除操作,包括直接使用 Hibernate API 的方法及其局限性,以及如何通过 JDBC 或存储过程实现更优的性能。 ... [详细]
  • 本文总结了MySQL的一些实用技巧,包括查询版本、修改字段属性、添加自动增长字段、备份与恢复数据库等操作,并提供了一些常见的SQL语句示例。 ... [详细]
  • 本文探讨了随着并发需求的增长,MySQL数据库架构如何从简单的单一实例发展到复杂的分布式系统,以及每一步演进背后的原理和技术解决方案。 ... [详细]
  • 深入理解SQL Server中的聚集与非聚集索引
    本文探讨了SQL Server数据库中两种主要的索引类型——聚集索引和非聚集索引,通过对比分析它们的特点及应用场景,旨在帮助读者更好地理解和利用这两种索引以优化查询性能。 ... [详细]
  • 深入理解Python中的sorted高阶函数
    排序是编程中常见的需求,无论是简单的数字排序还是复杂的对象排序,其核心都是比较两个元素。本文将探讨如何利用Python的高阶函数`sorted()`,通过自定义键函数来实现灵活多样的排序逻辑。 ... [详细]
  • 作为一名Java Web开发新手,我在尝试将项目部署至Tomcat服务器并连接MySQL数据库时遇到了驱动加载失败的问题。经过一番排查和努力,最终找到了解决方案。 ... [详细]
  • sqlserver动态分区方案例子
    sqlserver动态分区方案例子当我们存储的数据量比较大时,比如超过千万,上亿级别时单纯的使用索引可能效果不明显了,此时我们可以考虑采 ... [详细]
  • 深入理解Java MySQL数据库连接池实现
    尽管利用Apache Commons DBCP等工具可以轻松构建数据库连接池,但本文详细解析了数据库连接池的工作机制,提供了详尽的注释,帮助开发者深入理解其内部运作。这不仅有助于提高数据库操作的效率,还能增强应用程序的稳定性和性能。 ... [详细]
  • 本文探讨了在H2内存数据库中使用to_char函数遇到的问题,包括别名创建失败和堆栈内存溢出的情况,并提供了解决方案。 ... [详细]
  • 本文深入探讨网页游戏的开发流程,涵盖从程序框架设计到具体实现的技术细节,旨在为开发者提供全面的指导。 ... [详细]
  • GBase 8s SQL 指南:多列约束详解
    本文档详细介绍了如何在GBase 8s中使用多列约束格式,将其应用于现有表的一列或多列。这种格式类似于CREATE TABLE语句中的多列约束,但提供了一些额外的选项,如INDEX DISABLED关键字。 ... [详细]
  • PySpark实战:高效使用DataFrame超越RDD
    本文深入探讨了PySpark中DataFrame的使用方法及其相对于传统RDD的优势,旨在帮助开发者更好地理解和利用这一强大工具。 ... [详细]
  • 今天发现Mysql的主从数据库没有同步先上Master库:mysqlshowprocesslist;查看下进程是否Sleep太多。发现很正常。showmaster ... [详细]
  • 本文总结了WebSphere应用服务器出现宕机问题的解决方法,重点讨论了关键参数的调整,包括数据源连接池、线程池设置以及JVM堆大小等,旨在提升系统的稳定性和性能。 ... [详细]
  • 本文探讨了Java编程中MVC模式的优势与局限,以及如何利用Java开发一款基于鸟瞰视角的赛车游戏。 ... [详细]
author-avatar
静心-苑
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有