在事务中插入数据后,Flowable 未更新

Flowable not updated after inserting data inside a transaction

当我们使用 Flowable 在插入新的数据库行后获取更新通知时,工作正常。
但是当插入在另一个显式事务中完成时,Flowable 不会收到通知。

为了说明这个问题,我从 android-architecture-components 中分叉了 BasicRxJavaSample 并向 UserDaoTest.java

添加了 2 个测试方法
@Test
public void testFlowable() {
    // When subscribing to the emissions of the user
    final TestSubscriber<User> userTestSubscriber = mDatabase.userDao().getUser().test();

    userTestSubscriber.assertValueCount(0);

    // When inserting a new user in the data source
    mDatabase.userDao().insertUser(USER);

    userTestSubscriber.assertValueCount(1);
}

这很好用。但是当我在一个显式事务中做同样的事情时它不起作用:

@Test
public void testFlowableInTransaction() {
    // When subscribing to the emissions of the user
    final TestSubscriber<User> userTestSubscriber = mDatabase.userDao().getUser().test();

    userTestSubscriber.assertValueCount(0);

    // When inserting a new user in the data source
    mDatabase.beginTransaction();
    try {
        mDatabase.userDao().insertUser(USER);
        mDatabase.setTransactionSuccessful();

    } finally {
        mDatabase.endTransaction();
    }

    userTestSubscriber.assertValueCount(1);
    // this fails - the userTestSubscriber is still empty!
}

注意:这个例子当然是简化的,只是为了说明问题。

这是生成的 DaoImpl.insertUser():

  public void insertUser(User user) {
    __db.beginTransaction();
    try {
      __insertionAdapterOfUser.insert(user);
      __db.setTransactionSuccessful();
    } finally {
      __db.endTransaction();
    }
  }

我们可以看到这段代码使用了一个事务,我的测试代码也使用了另一个事务。
根据 SupportSQLiteDatabase-beginTransaction() 文档,嵌套事务应该没问题。

这可能是房间错误吗?

这个项目的room版本是1.0.0-alpha3,但是我在版本1.0.0-alpha8(在另一个项目中)也看到了这个问题

这是房间中的错误:#65471397

我确认错误已在版本 1.0.0-rc1

中修复