2017-08-22 2 views
0

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)

+0

en tant que solution de contournement temporaire hacky Je peux appeler 'mDatabase.getInvalidationTracker(). refreshVersionsSync();' après le bloc de transaction – TmTron

+0

Problème sur le Google tracker: [# 65471397] (https: // issuetracker.google.com/issues/65471 397) – TmTron

Répondre

0

Ce fut un bug dans la chambre: #65471397

Je vérifié que le bug a été corrigé avec la version 1.0.0-rc1