在事务中插入数据后,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
中修复
当我们使用 Flowable 在插入新的数据库行后获取更新通知时,工作正常。
但是当插入在另一个显式事务中完成时,Flowable 不会收到通知。
为了说明这个问题,我从 android-architecture-components
中分叉了 BasicRxJavaSample
并向 UserDaoTest.java
@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