0

ページングライブラリで使用するためにカスタムTiledDataSourceを実装しようとしました。私がLivePagedListProviderのような戻り値の型を私のDaoメソッドに使用したときは、テーブル項目の更新後に自動的に更新されていました。ページングライブラリ付きカスタムTiledDataSource

@Query("SELECT * FROM " + Table.States.PLAY_STATE + ", "+Table.Chart.ARTIST+ " ORDER BY position ASC") 
LivePagedListProvider<Artist> loadArtists(); 

しかし、私は私のオブザーバーをトリガしないLivePagerListProviderテーブルの更新のためのカスタムTiledDataSourceを実装してみてください。

抽象ジェネリッククラス:この場合の

public abstract class PagedNetworkBoundResource<ResultType, RequestType> extends TiledDataSource<ResultType> { 

    @Override 
    public int countItems() { 
     return DataSource.COUNT_UNDEFINED; 
    } 

    @Override 
    public List<ResultType> loadRange(int startPosition, int count) { 
     fetchFromNetwork(startPosition, count); 
     return loadFromDb(startPosition, count); 
    } 

    @WorkerThread 
    private void fetchFromNetwork(int startPosition, int count) { 
     if (createCall(startPosition, count) != null) 
      try { 
       Response<RequestType> response = createCall(startPosition, count).execute(); 
       if (response.isSuccessful() && response.code() == 200) { 
        saveCallResult(response.body()); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
    } 

    @WorkerThread 
    protected abstract void saveCallResult(@NonNull RequestType item); 


    @WorkerThread 
    protected abstract List<ResultType> loadFromDb(int startPosition, int count); 

    @WorkerThread 
    protected abstract Call<RequestType> createCall(int startPosition, int count); 

    public LiveData<PagedList<ResultType>> getAsLiveData() { 
     return new LivePagedListProvider<Integer, ResultType>() { 
      @Override 
      protected DataSource<Integer, ResultType> createDataSource() { 
       return PagedNetworkBoundResource.this; 
      } 

     }.create(0, new PagedList.Config.Builder() 
       .setEnablePlaceholders(false) 
       .setPageSize(20) 
       .setInitialLoadSizeHint(20) 
       .build()); 
    } 
} 

マイDAO方法:

@Query("SELECT * FROM " + Table.States.PLAY_STATE + ", "+Table.Chart.ARTIST+ " ORDER BY position ASC LIMIT (:limit) OFFSET (:offset)") 
List<Artist> loadArtists(int offset, int limit); 

私はTable.States.PLAY_STATEを更新します。私はPlayerStateEntity(ない良い解決策はなく、UI項目の状態を表現するために、この簡単な方法)からフィールドを追加し、各項目についてArtist

public void updatePlayerState(PlayerStateEntity state){ 
     new Thread(() -> { 
      dao.deleteState(); 
      dao.insertState(state); 
     }).run(); 
    } 


@Dao 
public interface PlayStateDao { 

    @Insert(onConflict = OnConflictStrategy.REPLACE) 
    void insertState(PlayerStateEntity playEntity); 

    @Query("DELETE FROM " + Table.States.PLAY_STATE) 
    void deleteState(); 

    @Query("SELECT * FROM "+Table.States.PLAY_STATE) 
    PlayerStateEntity getPlayerState(); 
} 

@Entity(tableName = Table.States.PLAY_STATE) 
public class PlayerStateEntity extends IdEntity { 

    @ColumnInfo(name = "album_played_id") 
    private Long albumPlayedId = -1L; 

    @ColumnInfo(name = "track_played_id") 
    private Long trackPlayedId = -1L; 

    @ColumnInfo(name = "artist_played_id") 
    private Long artistPlayedId = -1L; 


    @ColumnInfo(name = "state") 
    private PlayingState state; 

    @ColumnInfo(name = "playing_type") 
    private PlayingType playingType; 

    public Long getAlbumPlayedId() { 
     return albumPlayedId; 
    } 

    public void setAlbumPlayedId(Long albumPlayedId) { 
     this.albumPlayedId = albumPlayedId; 
    } 

    public Long getTrackPlayedId() { 
     return trackPlayedId; 
    } 

    public void setTrackPlayedId(Long trackPlayedId) { 
     this.trackPlayedId = trackPlayedId; 
    } 

    public Long getArtistPlayedId() { 
     return artistPlayedId; 
    } 

    public void setArtistPlayedId(Long artistPlayedId) { 
     this.artistPlayedId = artistPlayedId; 
    } 

    public PlayingState getState() { 
     return state; 
    } 

    public void setState(PlayingState state) { 
     this.state = state; 
    } 

    public PlayingType getPlayingType() { 
     return playingType; 
    } 

    public void setPlayingType(PlayingType playingType) { 
     this.playingType = playingType; 
    } 
} 

class Artist extends PlayEntity{ 
    private String name; 
    private String link; 
    private String picture; 
    @ColumnInfo(name = "picture_small") 
    private String pictureSmall; 
    @ColumnInfo(name = "picture_medium") 
    private String pictureMedium; 
    @ColumnInfo(name = "picture_big") 
    private String pictureBig; 
    @ColumnInfo(name = "picture_xl") 
    private String pictureXl; 
    private Boolean radio; 
    private String tracklist; 
    private Integer position; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getLink() { 
     return link; 
    } 

    public void setLink(String link) { 
     this.link = link; 
    } 

    public String getPicture() { 
     return picture; 
    } 

    public void setPicture(String picture) { 
     this.picture = picture; 
    } 

    public String getPictureSmall() { 
     return pictureSmall; 
    } 

    public void setPictureSmall(String pictureSmall) { 
     this.pictureSmall = pictureSmall; 
    } 

    public String getPictureMedium() { 
     return pictureMedium; 
    } 

    public void setPictureMedium(String pictureMedium) { 
     this.pictureMedium = pictureMedium; 
    } 

    public String getPictureBig() { 
     return pictureBig; 
    } 

    public void setPictureBig(String pictureBig) { 
     this.pictureBig = pictureBig; 
    } 

    public String getPictureXl() { 
     return pictureXl; 
    } 

    public void setPictureXl(String pictureXl) { 
     this.pictureXl = pictureXl; 
    } 

    public Boolean getRadio() { 
     return radio; 
    } 

    public void setRadio(Boolean radio) { 
     this.radio = radio; 
    } 

    public String getTracklist() { 
     return tracklist; 
    } 

    public void setTracklist(String tracklist) { 
     this.tracklist = tracklist; 
    } 

    public Integer getPosition() { 
     return position; 
    } 

    public void setPosition(Integer position) { 
     this.position = position; 
    } 

    @Override 
    public boolean isItemPlaying() { 
     return getId() == getArtistPlayedId().longValue() && getPlayingType() == PlayingType.Artist && getState() == PlayingState.Playing; 
    } 
} 

public abstract class PlayEntity extends PlayerStateEntity { 

    public abstract boolean isItemPlaying(); 
} 

public class ArtistsRepository { 
    private final ChartArtistDao chartArtistDao; 
    private final DeezerService deezerService; 


    @Inject 
    public ArtistsRepository(ChartArtistDao chartArtistDao, DeezerService deezerService) { 
     this.chartArtistDao = chartArtistDao; 
     this.deezerService = deezerService; 
    } 


    public LiveData<PagedList<ChartArtistDao.Artist>> getArtist() { 



     return new PagedNetworkBoundResource<ChartArtistDao.Artist, ModelList<ChartArtistEntity>>() { 

      @Override 
      protected void saveCallResult(@NonNull ModelList<ChartArtistEntity> item) { 
       if (item != null) { 
        chartArtistDao.saveArtists(item.getItems()); 
       } 
      } 

      @Override 
      protected List<ChartArtistDao.Artist> loadFromDb(int startPosition, int count) { 
       return chartArtistDao.loadArtists(startPosition, count); 
      } 

      @Override 
      protected Call<ModelList<ChartArtistEntity>> createCall(int startPosition, int count) { 
       return deezerService.getChartArtist(startPosition, count); 
      } 

     }.getAsLiveData(); 
    } 
} 

PlayerStateEntityテーブルの更新後ルームはデータの変更について通知する必要がありますが、それは行いません。

ルームは私が使用したクエリについて知らず、ページングライブラリによって提供されるRecyclerViewを更新できないことを理解します。しかし、将来、私の更新をトリガするために、私がDataSourceの中で使ったテーブルについてRoomに通知する方法を知っている人がいますか?

+0

「テーブルの更新」はどのように見えるのですか? – pskink

+0

@pskink質問を更新しました。ありがとう。 – Alex

+1

私はまだ 'loadFromDb'実装を見ることはできませんが、' RoomDatabase#getInvalidationTracker() 'と' DataSource#invalidate() 'を見てください。 – pskink

答えて

0

問題はカスタムDataSourceの実現に関連していました。データが変更された場合、LivePagedListProviderは、正しい更新のために新しいDataSourceインスタンスを作成する必要があります。私は同じインスタンスを使用したので、私の以前の解決策は正しくありません。

関連する問題