我在我的 Android Studio 项目中使用 room 框架。我正在尝试在接口内创建事务。我已经从这里阅读了文档:https://developer.android.com/reference/androidx/room/Transaction
我知道我们应该在抽象类中而不是在接口中创建事务。我只是想知道这是否可能,因为我的项目中已经有十多个接口,并且不想将它们重写为抽象类。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
您所尝试的操作在接口中是不可能的,因为您不能在接口中使用带有主体的方法。
更具体地说,您尝试执行多个语句(一条 UPDATE,然后一条 DELETE),但同时只能执行一条语句。
您的选择是定义一个触发器(更新后,如果可以从触发器内确定权重行)或者可能更可能使用抽象类,从而使用一个函数来执行多个语句或使用利用的方法(传递/或检索)SupportSQliteDatabase(使用抽象类更简单)。
然后,要利用事务,您将在函数之前有一个虚拟的@Query。例如
附加
这是一个工作演示,设计为仅运行一次,它使用所有三种方法。
首先是
@Entities
,基于代码中可用的内容,但已使用 long 来表示日期(而不是使用类型转换器)。访问
重量
@Dao
带注释的抽象类,具有普通的抽象方法和带主体的方法(解决方案 1)。 insert 方法允许插入一些数据(仅一行)。现在,
@Database
带注释的类(使用单例)稍微复杂一些。这有一个回调来添加触发器,触发器过于复杂,因为它不仅在更新后进行删除(不是删除任何内容),而且还在访问表中添加一个新行显示 TRIGGER 实际上正在被触发(解决方案 2)。
此外,由于需要更好的地方(或不取决于风格/实践),包含一个函数来获取和使用 SupportSQLiteDatabase(解决方案 3)
要实际利用上面的一些活动代码MainActivity
演示结果 通过 SppInspection
正如预期的重量表是空的:-
正如预期的那样,访问表中有 4 行:-
最后,架构(即 sqlite_master)显示触发器存在(必须添加额外的 3 行):-