Lorsque nous utilisons un fluide pour obtenir une notification de mise à jour après l'insertion d'une nouvelle ligne de base de données, cela fonctionne correctement.
Cependant, lorsque l'insertion est effectuée dans une autre transaction explicite, la commande Flowable n'obtient pas de notification.Fluide non mis à jour après l'insertion de données dans une transaction
Pour illustrer la question, j'ai bifurqué le BasicRxJavaSample
de android-architecture-components
et ajouté 2 méthodes d'essai utilisées pour 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);
}
Cela fonctionne très bien. Mais quand je fais la même chose à l'intérieur d'une transaction explicite ne fonctionne pas:
@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!
}
Note: cet exemple est évidemment simplifiée, juste pour illustrer la question.
Voici le produit DaoImpl.insertUser()
:
public void insertUser(User user) {
__db.beginTransaction();
try {
__insertionAdapterOfUser.insert(user);
__db.setTransactionSuccessful();
} finally {
__db.endTransaction();
}
}
Nous pouvons voir que ce code utilise une transaction et aussi mon test-code utilise une autre transaction.
Selon les docs SupportSQLiteDatabase-beginTransaction(), les transactions d'imbrication devraient être correctes.
Est-ce que c'est peut-être un bug de salle?
La version chambre de ce projet est 1.0.0-alpha3
, mais je peux aussi voir ce problème avec la version 1.0.0-alpha8
(dans un autre projet)
en tant que solution de contournement temporaire hacky Je peux appeler 'mDatabase.getInvalidationTracker(). refreshVersionsSync();' après le bloc de transaction – TmTron
Problème sur le Google tracker: [# 65471397] (https: // issuetracker.google.com/issues/65471 397) – TmTron