1

Service에서 수정해야하는 LiveData을 포함하는 ViewModel을 사용하는 Activity이 있습니다.서비스에서 라이브 데이터 업데이트

은 내가해야 할 것은 :

LiveData는 그것이 Service에서 수정할 때 그래서, UI가 업데이트됩니다 Activity에서 관찰된다. 이를 위해서는 MutableLiveData을 사용해야합니다.

  1. 은 내가 Room 데이터베이스에 LiveData를 저장해야 또는이 문제에 대한 더 우아한 해결책은 무엇입니까?

  2. 룸을 사용하는 경우 해결 방법은이 고유 한 엔티티를 저장하고 업데이트하는 방법입니다. 권장 안드로이드 아키텍처를 기반으로

답변

0

, 당신은 ViewModel에 데이터를 공급하는 임무 클래스에 다름이없는 Repository을 가져야한다, 저장소는 Room database에서 데이터를 가져와로를 새로 서비스를 프롬프트 데이터베이스 RoomDB에서 가져온 데이터는 라이브 데이터이며 서비스에 의해 일단 업데이트되면 해당 관찰자가 해고됩니다. 빠른 답변 Android architecture components

public class MovieRepository { 
 

 
    private static final String language = "en-US"; 
 
    private static final String sortBy = "popularity.desc"; 
 
    private static final String includeAdult = "false"; 
 
    private static final String includeVideo = "false"; 
 
    private static final String page = "1"; 
 

 
    Resources mResources; 
 

 
    MovieDatabase mMovieDatabase; 
 
    MoviesInterfaceImpl mMoviesInterface; 
 
    MoviesWatchApplication mMoviesWatchApplication; 
 

 

 
    public MovieRepository(MovieDatabase movieDatabase, 
 
          MoviesInterfaceImpl moviesInterface, 
 
          MoviesWatchApplication moviesWatchApplication) { 
 

 
     mMovieDatabase = movieDatabase; 
 
     mMoviesInterface = moviesInterface; 
 
     mMoviesWatchApplication = moviesWatchApplication; 
 
    } 
 

 
    public LiveData<List<Movie>> getMovies() { 
 
     mResources = mMoviesWatchApplication.getApplicationContext().getResources(); 
 
     refreshMovies(); 
 

 

 

 
     LiveData<List<Movie> > movies = mMovieDatabase.movieDao().getMovies(); 
 
     return movies; 
 
    } 
 

 
    private void refreshMovies() { 
 
     mMoviesInterface.discoverMovies(
 
       mResources.getString(R.string.api_key), 
 
       language, sortBy, includeAdult, includeVideo , page 
 
     ).enqueue(new Callback<DiscoverResponse>() { 
 

 
      @RequiresApi(api = Build.VERSION_CODES.N) 
 
      @Override 
 
      public void onResponse(Call<DiscoverResponse> call, Response<DiscoverResponse> response) { 
 
       if(response.code() == 200) { 
 
        List<Movie> movieList = new ArrayList<>(); 
 

 
        response.body().getResults().forEach((result) -> { 
 
         Movie movie = new Movie(result); 
 
         movieList.add(movie); 
 
        }); 
 

 
        mMovieDatabase.movieDao().addMovies(movieList); 
 
       } 
 
      } 
 

 
      @Override 
 
      public void onFailure(Call<DiscoverResponse> call, Throwable t) { 
 

 
      } 
 
     }); 
 
    } 
 
}

+0

감사합니다! 내 유스 케이스가 조금 다릅니다. 지금은 단 하나의 엔티티를 저장하고 수정하는 데만 관심이 있지만 Dao는 MutableLiveData를 쿼리의 반환 유형으로 받아들이지 않는 것 같습니다. 서비스에서이 엔티티를 어떻게 편집 할 수 있습니까? – adriennoir