假设有一个具有以下两种方法的Dao类:
(1)
delete(items: List<Item>): Completable
(2)
insert(items: List< Item >): Single<List<Long>>
如何将它们链接到Dao类中的一个事务方法中,从“delete method”开始,然后返回“insert method”结果?
我想要一个签名如下的方法:
@Transaction
fun deleteAndInsert(): Single<List<Long> > {
...
}
>
当我将代码反编译为java时,我看到了。
public interface CustomerDao {
@Transaction
@NotNull
List deleteAndCreate(@NotNull List var1);
@Query("DELETE FROM customer")
@NotNull
Completable deleteAll();
@Insert
@NotNull
List insertAll(@NotNull List var1);
@Metadata(
mv = {1, 1, 15},
bv = {1, 0, 3},
k = 3
)
public static final class DefaultImpls {
@Transaction
@NotNull
public static List deleteAndCreate(CustomerDao $this, @NotNull List
users)
{
Intrinsics.checkParameterIsNotNull(users, "users");
$this.deleteAll();
return $this.insertAll(users);
}
}
}
我觉得不太可能。
我曾经尝试过它,但我得到了一个编译时错误:
“带有@Transaction注释的方法不能返回延迟/异步返回类型io.reactivex.Single。由于事务是线程限制的,并且Room不能保证方法实现中的所有查询都在同一线程上执行,因此只允许同步的@Transaction实现的方法。如果启动了事务并更改了线程,然后等待数据库如果其他线程尝试执行查询,则可能会发生死锁。此限制可防止发生此类情况。“”
我假设您的主要目标是将deleteAndInert()
的返回类型设置为单
。
您可以实现这一点与小修改
delete()
和插入()
函数同步。@Transaction
只能同步工作,我们需要创建另一个函数来调用delete()
和插入()
。此外,使用@Transaction
单
并调用上述函数。abstract class SampleDao{
protected abstract fun delete()
protected abstract fun insert(items: List<Item>) : List<Long>
@Transaction
protected open fun deleteAndInsertSync(items: List<Item>): List<Long>{
delete()
return insert(items)
}
fun deleteAndInsert(items:List<Item>): Single<List<Long>>{
return Single.create {
it.onSuccess(deleteAndInsertSync(items))
}
}
}
所以我需要从插入函数中取回插入项目的ID。包括来自Google的消息来源在内的多个消息来源都表示,可以通过作为@插入带注释DAO函数的返回值的单执行此操作。不幸的是,编译总是以以下方式退出: 我试着改成也许 我的代码如下所示: 我完全不知道是什么导致了这一切。那么,我做错了什么?如果这只是一个bug,那么在我的活动和这个活动数据的上下文中获取id的解决方法是什么? 更新:找到了一个非常奇怪的解决方
getAllTransactions()调用运行时没有异常,但不返回结果。另一方面,getMyTransactions()返回select查询结果。 在viewModel: 在活动中:
我有一个插入行的查询 我正在使用RxJava在后台线程上执行查询: 目前,它成功返回为插入的DAO新创建的主键。如何返回整个插入的行,而不使用新的行ID执行第二次查询? 在postgreql我会做这样的事情: 不知道如何使用房间图书馆
在viewmodel类中获取数据方法
在我的Android项目中,我使用Room库来处理SQLite数据库。我使用我的数据库来保存国家电话代码。我的数据库预加载了两个国家(watch大众数据库与国家代码(道:电话代码道)功能); 国家代码实体 DAO接口 在我的应用程序中,我按顺序选择国家代码(观察函数selectCountryCodeByOrder(order:Int):Int)。我在异步{}协同例程中异步调用此函数。但我有一个相当