現在、Android Architecture Componentsを使用するためにレガシーコードをリファクタリングしています。一種のリポジトリパターンでルームのdbとvolleyのリクエストを設定しています。 したがって、プレゼンテーション/ドメイン層は、LiveDataオブジェクトを取得してサーバーと同期するようにLiveDataオブジェクトを取得するようにリポジトリに依頼します。その後、古いdbエントリは削除され、現在のすべてのエントリがサーバーから再フェッチされます。データベースの更新時にLiveDataのリストが更新されない
私は同期部分のテストを書いたので、オブジェクトがフェッチされ、データベースに正しく挿入されると確信しています。しかし、そのdbテーブルのエントリを観察するためのテストを書くとき(そしてオブジェクトが正しく保存されているかどうかテストして、それらをdbに入れる前に行う必要があります)、LiveData>私は観察しています。
次のスニペットでは、synchronizeFormsWithServer(...)メソッドが正しく機能し、データベース操作を非同期で実行していると想定できます。これは、サーバーからフェッチされたフォームのリストに存在しないすべてのフォームオブジェクトをデータベースから削除し、新しいフォームオブジェクトをすべて挿入する操作を含みます。テストの開始時にデータベースが空であるので、これは問題ではないはずそれほど
観察者がトリガされませんしたテスト:
@Test
public void shouldSaveFormsFromServerIntoDb() throws Exception
{
Lifecycle lifecycle = Mockito.mock(Lifecycle.class);
when(lifecycle.getCurrentState()).thenReturn(Lifecycle.State.RESUMED);
LifecycleOwner owner = Mockito.mock(LifecycleOwner.class);
when(owner.getLifecycle()).thenReturn(lifecycle);
final CountDownLatch l = new CountDownLatch(19);
formRepository.allForms().observe(owner, formList ->
{
if (formList != null && formList.isEmpty())
{
for (Form form : formList)
{
testForm(form);
l.countDown();
}
}
});
formRepository.synchronizeFormsWithServer(owner);
l.await(2, TimeUnit.MINUTES);
assertEquals(0, l.getCount());
}
FormRepositoryコード:
@Override
public LiveData<List<Form>> allForms()
{
return formDatastore.getAllForms();
}
データストア:
@Override
public LiveData<List<Form>> getAllForms()
{
return database.formDao().getAllForms();
}
formDaoコード(あなたは元をいただきたいどのようにデータベースが実装されています)部屋からそれをPECT:
@Query("SELECT * FROM form")
LiveData<List<Form>> getAllForms();
それは非常によく、これはそれらを使用して、私は初めてなので、多分私は根本的に間違って何かを得たので、私は、LiveData・コンポーネントについて何かを理解していなかったということであってもよいです。
ヘルプのすべてのビットは、非常に高く評価される:)
PSを:私は同様の問題を論じてTHISポスト、全体でつまずいたが、私は現在、すべてのDIを使用していないのでただの単一のインスタンスを使用しますformrepository(formDaoのインスタンスが1つしか関連付けられていない)は同じ問題だとは思わない。
私はあなたのアプローチを使用することを躊躇しています。それは、ルームが明示的にメインスレッド上でそのような操作を許可しているときに、 LiveDataが返された場合。 あなたの質問にあるすべてのコメント/チャットメッセージを読んだ後、私はそれが非常に奇妙で、その部屋はあなたが思うように振る舞い、たとえそれが事実だと思われるとしても見つかりません 本当に他の選択肢がない場合は、そのようにしてください。しかし、おそらく誰かが問題にもっと光を当てて、DAOから直接LiveDataを返す方法を見つけることができます:) –
これはあまりにも奇妙なので、私はこれがこのように動作するので嬉しいでしょう:) – joao86
他のサービスがDB値を変更したときにUIを更新しますか? リポジトリのget(...)メソッドを呼び出すときに値をリフレッシュするだけで問題はありませんが、たとえばContentProviderが何かをDBに挿入すると、UIには表示されません次のTime get(...)が呼び出されるまで変更されます。 リンク先の質問コードについてここでお答えください –