2017-06-18 29 views
1

我有這個疑問:房間如何通知UI數據已更改?

@Query("SELECT * FROM Movie") 
LiveData<List<Movie>> getAll(); 

這是我的ViewModel:

public class MainActivityViewModel extends ViewModel { 

    @Inject AppDatabase db; 
    private LiveData<List<Movie>> data; 

    public MainActivityViewModel() { 
     MovieApp.graph().inject(this); 
     data = db.movieDao().getAll(); 
    } 

    LiveData<List<Movie>> getData() { 
     return data; 
    } 
} 

在我活動的onCreate我打電話:

viewModel.getData().observe(this, adapter::setMovies); 

JobService我下載一個JSON和將其轉換爲Room物件並致電

db.movieDao().insertAll(movies.results); 

,但什麼也沒有發生:-(

我必須觸發客房手動刷新或將房間爲我自動?我想念什麼?

編輯:

我加了一些註銷,這是什麼順序迄今發生的情況:

  • MainActivityViewModel創建並調用db.movieDao().getAll()
  • 活動觀察視圖模型viewModel.getData().observe(this, adapter::setMovies)
  • setMovies叫有0個數據
  • coupl幾秒鐘後Ë已經JobService啓動,加載數據並調用db.movieDao().insertAll(movies.results)

在這一點上,我期望從房間刷新調用,因爲DB數據已更改,但沒有任何反應。

+0

'setMovies'確實調用了'notifyDataSetChanged()',對吧? – EpicPandaForce

+0

@EpicPandaForce是的。但是隻有在沒有數據和下載開始之前調用它。下載完成後不會再次調用。當我重新啓動應用程序時,我看到從前一次運行中下載的東西。 –

+0

你在這兩個地方使用了相同的'RoomDatabase'實例嗎?例如,如果您的'JobService'與UI代碼處於不同的進程中,則根據定義,這些是獨立的'RoomDatabase'。實例。 – CommonsWare

回答