首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

想使用房间数据库事务在Android应用程序中根据不同的类对象在多个表中插入数据

在Android应用程序中使用Room数据库事务来根据不同的类对象在多个表中插入数据,是一个常见的需求。下面我将详细解释相关的概念、优势、类型、应用场景,并提供一个示例代码来解决这个问题。

基础概念

Room数据库:Room是Android官方提供的SQLite数据库抽象层,它简化了数据库操作,并提供了编译时检查SQL查询的功能。

事务(Transaction):事务是一组操作的集合,这些操作要么全部成功执行,要么全部不执行。事务保证了数据的一致性和完整性。

优势

  1. 数据一致性:事务确保了多个数据库操作要么全部成功,要么全部失败,避免了数据的不一致状态。
  2. 性能优化:通过批量处理多个操作,事务可以提高数据库操作的效率。
  3. 错误处理:事务提供了一种机制来处理操作失败的情况,可以回滚到操作前的状态。

类型

  • 自动提交事务:默认情况下,每个SQL语句都是一个独立的事务。
  • 显式事务:通过代码显式地开始和结束事务。

应用场景

  • 批量插入或更新:当需要同时向多个表插入或更新数据时。
  • 复杂业务逻辑:涉及多个步骤的业务逻辑,需要确保所有步骤都成功执行。

示例代码

假设我们有两个表:UserOrder,我们需要在一个事务中同时插入用户信息和订单信息。

首先,定义实体类和DAO接口:

代码语言:txt
复制
@Entity
public class User {
    @PrimaryKey(autoGenerate = true)
    public int id;
    public String name;
}

@Entity
public class Order {
    @PrimaryKey(autoGenerate = true)
    public int id;
    public int userId;
    public String product;
}

@Dao
public interface UserDao {
    @Insert
    void insert(User user);

    @Insert
    void insert(Order order);
}

@Database(entities = {User.class, Order.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

然后,在Repository或ViewModel中使用事务来插入数据:

代码语言:txt
复制
public class UserRepository {
    private final UserDao userDao;

    public UserRepository(Application application) {
        AppDatabase db = Room.databaseBuilder(application, AppDatabase.class, "database-name").build();
        userDao = db.userDao();
    }

    public void insertUserAndOrder(User user, Order order) {
        userDao.insertInTransaction(user, order);
    }
}

在Activity或Fragment中调用:

代码语言:txt
复制
User user = new User();
user.name = "John Doe";

Order order = new Order();
order.userId = user.id;
order.product = "Laptop";

UserRepository repository = new UserRepository(getApplication());
repository.insertUserAndOrder(user, order);

解决问题的思路

如果在事务中遇到问题,比如某个插入操作失败,Room会自动回滚整个事务。你可以通过捕获异常来处理这种情况:

代码语言:txt
复制
try {
    userDao.insertInTransaction(user, order);
} catch (Exception e) {
    // 处理异常,比如记录日志或通知用户
    Log.e("DatabaseError", "Failed to insert user and order", e);
}

通过这种方式,你可以确保数据的一致性,并且在出现问题时能够及时处理。

希望这些信息对你有所帮助!如果有更多具体问题,欢迎继续提问。

相关搜索:如何使用javaFX在TreeView中插入多个不同的对象(类)在Oracle中,我想创建一个“路由接口”,根据参数插入到不同的表中如何使用spring JPA在同一事务中维护不同数据库上的多个sql查询使用c脚本将存储在变量中的数据插入Postgres数据库表我想插入到一个表,从另一个表在同一数据库在php中获得的数据如何使用EF Core迁移在我的数据库中创建多个表使用PHP Laravel 2019在postgres中连接来自不同数据库的2个或多个表xamarin android将图像插入到在线数据库中,并以图像视图的形式显示在同一数据库中,但在不同的设备上有没有办法在中央数据库中编译/保存多个用户使用的excel应用程序中的数据?使用Spring和Hibernate在多个数据库中执行分布式事务的"最佳"方法是什么?如何使用while循环在3个不同的表中回显数据库的特定列如何从一个Oracle数据库的多个表中检索数据,创建一个数据表,然后将这些数据存储在C#中的一个类对象中?如何使用spring boot在Post方法中传递Json数据?我想传递几个变量,并在不同的java类中使用这些变量。如何使用SQliteOpenhelper将SQLite数据库路径更改为不同的文件夹(在应用程序目录中) :android项目我想更新我的房间数据库字段,同时在Android中禁用在回收视图项目中滑动,如何实现这一点?如何使用*ngFor structural指令减少在表中显示列表(从数据库获取的json对象)的时间?如何使用Kubernetes在自己的数据库(user,time)中根据自己的自定义对象自动缩放应用实例?在Oracle/Generate insert语句中使用不同的值(SQL)将测试数据插入到表中的快速方法是什么?如何从两个不同的数据库表中使用两个mat-chip列表在一个表单中完成?如何使用Spring连接到两个不同的数据库,一个用于在同一应用程序中读取,另一个用于写入?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

精通Java事务编程(7)-可串行化隔离级别之两阶段锁定(2PL,two-phase locking)

3.2.1 实现原理 2PL已在: MySQL(InnoDB)和 SQL Server 实现可串行化 DB2 中的可重复读 读与写的阻塞是通过为数据库中每个对象添加锁来实现的。...会议室预订案例,若事务在查询某时间段内一个房间的预订情况,则另一个事务不能同时插入或更新同一时间段内该房间的预订 (可同时插入其他房间的预订或在不影响另一个预定的条件下预定同一房间的其他时间段)。...若B持有匹配的谓词锁,则A须等B完成提交或中止后才能继续 关键在于,谓词锁甚至适用于数据库中尚不存在,但将来可能会添加的对象(幻象)。...假设索引位于 room_id 上,并且数据库使用此索引查找 123 号房间的现有预订。现在数据库可以简单地将共享锁附加到这个索引项上,指示事务已搜索 123 号房间用于预订。...若另一事务想插入、更新或删除同一房间和/或重叠时间段的预订,则须更新这些索引的相同部分,就一定会和共享锁冲突,将被迫等到共享锁被释放。 这有效防止了幻读和写倾斜。

83820

【Android从零单排系列四十二】《Android数据存储方式-SQLite数据库》

一 SQLite数据库基本介绍 Android提供了SQLite数据库作为轻量级的嵌入式数据库解决方案,用于在应用程序中存储和管理结构化的数据。...数据表创建:在数据库中,需要创建表来存储数据。可以使用SQL语句或通过创建Java对象来定义表的结构。...数据库操作:可以使用SQLiteDatabase类执行各种数据库操作,包括插入、查询、更新和删除数据。通过构建适当的SQL语句和参数化查询,可以实现对数据库的操作。...在onCreate()方法中,使用SQL语句创建数据库和表,例如:CREATE TABLE语句。 在构造方法中指定数据库名称、版本号和表结构等信息,并调用父类的构造方法。...你可以根据自己的具体需求,使用合适的SQL语句和API来完成数据库的增删改查操作。同时,要确保在进行数据库操作时遵循良好的数据库设计原则,并注意处理异常情况以及对数据库性能进行优化。

25630
  • 运维必备之 db2 的锁

    db2 中基本的锁有两类: 排他锁(X锁),也叫写锁,当某行数据正在被修改时,其他进程不能再读取或修改 共享锁(S锁),也叫读锁,当某行数据正在被读取时,其他进程修改 db2 事务的隔离 锁的这种机制都是为事务隔离来服务的...也可以这样理解,一个事务第一次查询的结果集,被其他事务插入了新行并提交给数据库,导致第二次查询出现了第一次查询没有出现的结果集,在某些情况下,这是合理的,举例子理解如下: 时间点 事务A 事务 B 0...A 的 1 亿,并提交 3 再查询账户余额为 0 - 由于实际应用场景非常复杂,不同的业务要求的隔离级别也不一样,因此在进行数据库开发时一定要考虑事务的隔离级别,否则会出大问题。...这样可以保证在一个事务中即使多次读取同一行,得到的值不会改变。但是,如果使用这种隔离级,在一个事务中,如果使用同样的搜索标准重新打开已被处理过的游标,则结果集可能改变。...X锁及 NX 锁类似,但与W锁以及 NS 锁兼容 db2 锁转换 当程序向数据库请求它已经加锁的对象上面的锁的时候,数据库会比较对象上现在的锁与所请求的锁的模式,如果所请求的锁级别更高,则把现在的锁升级为请求的锁

    1.3K30

    2020最新版MySQL数据库面试题(二)

    幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的...死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。 常见的解决死锁的方法 1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。...怎么实现的? 数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。...触发器的使用场景有哪些? 触发器是用户定义在关系表上的一类由事件驱动的特殊的存储过程。触发器是指一段代码,当触发某个事件时,自动执行这些代码。...候选键:是最小超键,即没有冗余元素的超键。 主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。

    63520

    2020最新版MySQL数据库面试题(二)

    幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的...死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。 常见的解决死锁的方法 1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。...怎么实现的? 数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。...触发器的使用场景有哪些? 触发器是用户定义在关系表上的一类由事件驱动的特殊的存储过程。触发器是指一段代码,当触发某个事件时,自动执行这些代码。 使用场景 可以通过数据库中的相关表实现级联更改。...主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。 外键:在一个表中存在的另一个表的主键称此表的外键。

    64121

    精通Java事务编程(5)-弱隔离级别之写倾斜与幻读

    多个事务并发写相同对象时,会出现脏写和更新丢失两种竞争条件。为避免数据不一致,可: 借助DB内置机制 或通过显式加锁、执行原子写操作 但这还不算并发写可能引发的全部问题。 为医院写一个值班管理程序。...但为指定至少有一名医生必须在线,涉及多个对象的约束,大多DB都未内置这种约束,但你可使用触发器或物化视图来实现类似约束 若无法使用可串行化,则次优方案可能是显式锁定事务依赖的行: BEGIN TRANSACTION...物化冲突 若幻读的问题是没有对象可以加锁,也许可以考虑人为在DB引入一个锁对象? 如会议室预订案例,想象创建一个关于时间槽和房间的表。此表中的每行对应于特定时间段(如 15min)的特定房间。...可提前插入房间和时间的所有可能组合行(例如接下来的六个月)。 现在,要创建预订的事务可以锁定(SELECT FOR UPDATE)表中与所需房间和时间段对应的行。...---- PostgreSQL中,可使用范围类型优雅地执行此操作,但在其他数据库中并未得到广泛支持 ↩︎

    76620

    3. SQL 与 MySQL 基础

    、更新与删除,是开发以数据为中心的应用程序必定会使用到的指令。...至于某些长语句使用逗号,在不同的数据库系统中有不同的分隔规则。 SQL支持注释: 通过使用 -- 或是 # 来编写注释内容,也可以使用 /* 注释内容 */ 来进行多行注释。...例如: 在 MySQL 中删除表 Course: DROP TABLE Course; ---- 3.2.2 数据库操纵语言(DML) ---- 插入数据 ---- 使用 INSERT INTO 语句来向数据库中插入一条数据...; 那么视图相当于在这个房间上面开了一个“窗口”能够根据用户的需要来查看数据; 可以对这个“窗口”进行调整(修改),但无论如何修改都无法影响到房间内的人(实际的数据); 因此视图的本质就是一张虚表。...隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

    1.9K20

    Jdbc知识点全整理,你值得拥有 ​(2)

    l 实体域,即操作的对象,例如我们操作的表是user表,那么就需要先写一个User类; l DAO模式需要先提供一个DAO接口; l 然后再提供一个DAO接口的实现类; l 再编写一个DAO工厂,Service...这三个类都是java.util.Date的子类。 2 时间类型相互转换 把数据库的三种时间类型赋给java.util.Date,基本不用转换,因为这是把子类对象给父类的引用,不需要转换。...,需要在查询后使用ResultSet类的getBinaryStream()方法来获取输入流对象。...不可重复读和幻读的区别: 不可重复读是读取到了另一事务的更新; 幻读是读取到了另一事务的插入(MySQL中无法测试到幻读); 3 四大隔离级别 4个等级的事务隔离级别,在相同数据环境下,使用相同的输入,...执行相同的工作,根据不同的隔离级别,可以导致不同的结果。

    88540

    Sybase连接详解

    配置JDBC驱动程序:了解如何在Java应用程序中配置JDBC驱动程序,以确保它们能够正确连接到Sybase数据库。这通常包括在应用程序的类路径中添加JDBC驱动程序,并指定驱动程序的类名。...然后,我们使用getTableComment方法获取表的注释。这个方法执行一个查询,以检索表的注释信息。注意,这个示例假定注释信息存储在表的第一个列中,你可能需要根据实际情况进行调整。...在Java中插入数据到Sybase数据库通常涉及到使用SQL INSERT语句来执行插入操作。...这是一个基本的插入数据示例,你可以根据需要扩展它来执行更复杂的插入操作和处理不同类型的数据。 3.3 执行Sybase存储过程 存储过程在数据库中起着关键作用。...如果您希望控制事务的边界,可以显式地使用BEGIN TRANSACTION和COMMIT来定义和提交事务。 事务处理和异常处理:在应用程序中,通常会结合使用事务处理和异常处理,以处理事务中的错误情况。

    15910

    事务处理

    持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。...在执行SQL语句之前,先执行strat transaction,这就开启了一个事务(事务的起点),然后可以去执行多条SQL语句,最后要结束事务,commit表示提交,即事务中的多条SQL语句所做出的影响会持久化到数据库中...同一事务中所有的操作,都在使用同一个Connection对象!...不可重复读和幻读的区别 l 不可重复读是读取到了另一事务的更新; l 幻读是读取到了另一事务的插入(MySQL中无法测试到幻读); 4.3、四大隔离级别 4个等级的事务隔离级别,在相同数据环境下,使用相同的输入...,执行相同的工作,根据不同的隔离级别,可以导致不同的结果。

    47910

    Mysql高频面试题

    4、列设置为 AUTO INCREMENT 时,如果在表中达到最大值,会发生什么情况? 答:它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。...(所有关系型数据库系 统都满足第一范式数据库表中的字段都是单一属性的,不可再分) 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足 第二范式(2NF)必须先满足第一范式(1NF)。...Repeatable Read(可重读) >> 这是 MySQL 的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。...请简述常用的索引有哪些种类? 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。...更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』 MySQL索引的分类 我们根据对以列属性生成的索引大致分为两类: 单列索引:以该表的单个列,生成的索引树,就称为该表的单列索引 组合索引

    86010

    Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day7】 —— 数据库2(事务)

    当事务需要回滚时,MySQL会根据回滚日志对事务中已执行的SQL做逆向操作,比如 DELETE 掉一行数据的逆向操作就是再把这行数据 INSERT回去,其他操作同理。...像交警在马路口儿指挥交通一样,当并发处理多个DML更新操作时,如何让事务操作他该看到的数据,出现多个事务处理同一条数据时,让事务该排队的排队,别插队捣乱,保证数据和事务的相对隔离,这就是隔离性要干的事儿...幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的...使用表级锁定的主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎。 行锁   与表锁正相反,行锁最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。...使用该命令之后,数据更新语句、数据定义语句和更新类事务的提交语句等修改数据库的操作都会被阻塞。

    46520

    Realm、WCDB与SQLite移动数据库性能对比测试

    优势:兼顾iOS和Android两个平台;简单易用,学习成本低;提供了一个轻量级的数据库查看工具,开发者可以查看数据库当中的内容,执行简单的插入和删除数据的操作。...,支持iOS, macOS和Android。易用,支持事务,可加密、损坏修复。 二、测试数据表结构 Student表。 字段:ID、name、age、money。...四、Realm优缺点 优点: Realm在使用上和Core Data有点像,直接建立我们平常的对象Model类就是建立一个表了,确定主键、建立索引也在Model类里操作,几行代码就可以搞定,在操作上也可以很方便地增删改查...,不同于SQLite的SQL语句(即使用FMDB封装的操作依然有点麻烦),Realm在日常使用上非常简单,起码在这次测试的例子中两个数据库同样的一些操作,Realm的代码只有SQLite的一半。...需要注意的是如果是老工程想换新数据库,那么需要注意一些数据库迁移的问题,这中间必然存在一些阵痛,此外,Realm和WCDB都会用到自有的Model类来作为表结构。

    4.1K10

    Android Content provider 组件

    持有特定的许可,可以在自己开发的应用程序中访问这些Content Provider。...1.数据模型 Content Provider 将其存储的数据以数据表的形式提供给访问者,在数据表中每一行为一条记录,每一列为具有特定类型和意义的数据。...首先来介绍如何访问Content Provider中的数据,访问 Content Provider中的数据主要通过ContentResolver对象,ContentResolver类提供了成员方法可以用来对...对象,唯一不同的是 使用managedQuery 方法可以让Activity 来管理 Cursor 的生命周期。...Android应用程序可以使用文件或SqlLite数据库来存储数据。Content Provider提供了一种多应用间数据共享的方式,比如:联系人信息可以被多个应用程序访问。

    51740

    Android SQLite数据库基本用法详解

    SQLite 是自给自足的,这意味着不需要任何外部的依赖。 SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。...综合来看,即轻量 兼容 多端 无需配置 无外部依赖 拥有简单易懂的API 安全 在Android中如何使用 Android 提供的 SQLiteOpenHelper.java 是一个抽象类。...那么在Eclipse中创建Class类时,选择此抽象类模板即可,而在Android Studio中,必须自己写一个类来继承它,根据平时类名称简洁易懂的习惯上,我们创建的都是MyDataBaseHelper.java...= 0) { } 实操 在技能大赛中常用的数据库操作 一、在Class类中数据库的创建、绑定 解析:创建完毕数据库(SQLiteOpenHelper)类后,需要在类的OnCreate方法中通过SQL..., new String[]{"admin", "123456"}); } 然后在需要用到数据库的类、Activity或Fragment中新建数据库对象并绑定 在OnCreate方法外新建数据库对象

    2.2K30

    笔记(十)——安卓存储知识

    所有app程序共用一个SQLite数据库,但是数据库表不同,多个app不共用,这个需要注意理清。...应用程序(进程)内存(RAM)一般限制在16M,也有的是24M(早期的Android系统G1,就是只有16M),根据开发人员的定义也可以扩展;进程是作为资源分配的基本单位,可以创建多进程来获取系统分配更多的资源内存...错误也不会回收这种对象如果想中断强引用和某个对象之间的关联,可以显示地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。...原子提交意味着某个事务中数据库的变化会完整完成或者根本不完成。原子提交意味着不同的写入分别写入到数据库的不同部分就似同时发生在同一个时间点一样。...实际上硬件会连续的写到海量存储器中,只是写一个扇区所用的时间非常少。所以,同时或瞬间写入到数据文件的不同部分成为可能。SQLite的原子提交逻辑会使得一个事务中的变化就象同时发生的一样。

    1.3K31

    【Android开发基础系列】数据持久化专题

    作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧。...,作为维护和管理数据库的基类,DBManager是建立在DBHelper之上,封装了常用的业务方法,Person是我们的person表对应的JavaBean,MainActivity就是我们显示的界面。...为了方便我们面向对象的使用数据,我们建一个Person类,对应person表中的字段,如下: package com.scott.db; public class Person { public int_id...构造方法中实例化DBHelper并获取一个SQLiteDatabase对象,作为整个应用的数据库实例;在添加多个Person信息时,我们采用了事务处理,确保数据完整性;最后我们提供了一个closeDB方法...可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider。

    47120

    Android网络与数据存储——SQLite

    一.创建数据库和表 ---- Android提供了一个管理数据库的工具类SQLiteOpenHelper,用于管理数据库的创建和版本更新,创建SQLiteOpenHelper的子类,并实现它的onCreate...onCreate()方法:用于第一次使用软件时生成数据库表。...二.增、删、改、查 ---- SQLite数据库的增删改查有两种方法: 如上面创建数据表那样在db.execSQL()方法中传入SQL语句,对数据库进行增删改查。...insert long insert(String table, String nullColumnHack, ContentValues values) 参数说明如下: table:想插入数据的数据表名称...如果在事务执行中调用了该方法设置了事务成功,则提交事务;否则将会回滚事务。 判断当前上下文是否处于事务环境中:inTransaction() 四.优化 ---- 使用原始SQL语句执行效率更高。

    1.7K20

    Hibernate面试题大全

    使用Hibernate框架就不用我们写很多繁琐的SQL语句。Hibernate实现了ORM,能够将对象映射成数据库表,从而简化我们的开发! Hibernate是如何延迟加载(懒加载)?...2使用了外连接,select语句数目少; 缺点: 1 可能会加载应用程序不需要访问的对象,白白浪费许多内存空间;2复杂的数据库表连接也会影响检索性能; 预先抓取: fetch=“join”; hibernate...Ø 数据库设计调整 Ø HQL优化 Ø API的正确使用(如根据不同的业务类型选用不同的集合及查询API) Ø 主配置参数(日志,查询缓存,fetch_size, batch_size等) Ø 映射文件优化...所以两边都inverse=”true”是不对的,会导致任何操作都不触发对中间表的影响;当两边都inverse=”false”或默认时,会导致在中间表中插入两次关系。...在Hibernate中,@NameQuery用来定义单个的命名查询,@NameQueries用来定义多个命名查询。 为什么在Hibernate的实体类中要提供一个无参数的构造器这一点非常重要?

    2K50

    Android Room 持久化库

    使用@Database注解,并满足以下条件 是抽象类,并且继承自RoomDatabase 在注解中包含与数据库关联的实体列表。 包含一个具有0个参数的抽象方法,并返回用@Dao注解的类。...只有当已经拥有需要游标并且无法轻松重构的代码时才使用此功能。 查询多个表 有些时候可能需要查询多个表中的数据来计算结果。Room运行我们写任何查询,当然也允许连接其他表。...这里会解释为什么不支持对象引用和怎么使用类型转换器。 使用类型转换器 有时候你想存储自定义的数据类型在数据库的单个列中。...相反,您必须明确您的应用需要的数据。 将数据库中的关系映射到相应的对象模型是常见的做法,并且在服务器端运行良好。即使程序在访问时加载字段,服务器仍然运行良好。...如果作者类引用另一个表(如Books),则应用程序的效率会进一步降低。 要使用Room同时引用多个实体,需要创建一个包含每个实体的POJO,然后编写一个查询来加入相应的表。

    4K70
    领券