当前位置: 首页 > 知识库问答 >
问题:

如何使用房间Db返回Rx单笔交易?

金英华
2023-03-14

假设有一个具有以下两种方法的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> > {
    ...
}

共有3个答案

章海
2023-03-14

>

  • 用@Transaction注释的方法不能返回延迟/异步返回类型io。反应性X。仅有一个的由于事务是线程受限的,Room不能保证方法实现中的所有查询都在同一线程上执行,因此只允许同步@事务实现的方法。如果启动了一个事务,并且更改了线程并等待,那么如果其他线程尝试执行查询,则可能会发生数据库死锁。这种限制可防止此类情况发生
  • 当我将代码反编译为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);
       }
    }
    }
    

  • 宁欣怿
    2023-03-14

    我觉得不太可能。

    我曾经尝试过它,但我得到了一个编译时错误:

    “带有@Transaction注释的方法不能返回延迟/异步返回类型io.reactivex.Single。由于事务是线程限制的,并且Room不能保证方法实现中的所有查询都在同一线程上执行,因此只允许同步的@Transaction实现的方法。如果启动了事务并更改了线程,然后等待数据库如果其他线程尝试执行查询,则可能会发生死锁。此限制可防止发生此类情况。“”

    罗茂实
    2023-03-14

    我假设您的主要目标是将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)。我在异步{}协同例程中异步调用此函数。但我有一个相当