SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

アプリケーション開発の最新トレンド

Androidのページング処理のライブラリ「Paging 3」の移行と実装のポイント

  • X ポスト
  • このエントリーをはてなブックマークに追加

APIから取得したデータをDBに保存してキャッシュをする場合

Daoの実装

 次に、Anime、KeyそれぞれのDaoを順に実装していきます。

AnimeDaoの実装

 まずは、Animeのデータを扱うAnimeDaoを実装していきます。

 ここで必要になるメソッドは以下になります。

  • insertAnime:AnimeクラスのListを引数にとり、DBに保存するメソッドです。
  • getAnimePagingSource:AnimeのデータのPagingSourceを返却するメソッドです。戻り値にPagingSource<Int, Anime>のように指定するだけで、「APIから取得したデータを表示するだけ」の際に作成したPagingSourceをRoom側生成してくれるため、大変便利です。
  • deleteAllAnime():保存しているアニメをすべて削除するメソッドです。初期読み込みの際にいままで保存した不要になった古いデータを削除するために使用します。

 実装したサンプルコードは以下になります。

@Dao
interface AnimeDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertAnime(anime: List<Anime>)

    @Query("SELECT * FROM anime WHERE sessionId = :sessionId")
    fun getAnimePagingSource(sessionId: String): PagingSource<Int, Anime>

    @Query("DELETE FROM anime")
    suspend fun deleteAllAnime()
}

PageKeyDaoの実装

 次に、RemoteMediatorでデータ取得に使用するpageを保存するためのRemoteKeyDaoを作っていきます。

 RemoteMediatorでKeyの値を持つフィールドを定義し、インクリメントするという実装もできますが、DataBaseにsessionIdなどとともに保存した方がより堅実な実装ができるためDBにKeyを保存する手法をとっています。

 ここで必要となるメソッドは以下の3つになります。

  • insertKey:RemoteKeyを保存するためのメソッドです。RemoteMediatorでKeyを保存する際に使用します。
  • getLastKey:同じセッションのidでなおかつ最新のKeyを取得するメソッドです。RemoteMediatorでAPI呼び出しの際のnextKeyを取得するために作成します。
  • clearRemoteKey:データベース上に保存されているKeyをすべて削除するメソッドです。初期読み込みの際にいままで保存した不要になった古いKeyを削除するために使用します。
@Dao
interface PageKeyDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertKey(key: PageKey)

    @Query("SELECT * FROM page_key WHERE sessionId = :sessionId ORDER BY id DESC LIMIT 1")
    suspend fun getLastKey(sessionId: String): PageKey?

    @Query("DELETE FROM page_key")
    suspend fun deleteAllPageKey()
}

DataBaseの実装

 次に、DataBaseを実装していきます。本題ではないため軽く流しますが、TypeConvertersには以前作成したDBにそのまま保存できない型のConverterのクラスを指定します。

 次に、entitiesには以前作成したEntityのクラスを指定します。また、Daoを提供する抽象メソッドをそれぞれ定義します。

 実装したコードは以下になります。

@TypeConverters(AnimeConverter::class)
@Database(
    entities = [Anime::class, PageKey::class],
    version = 1,
    exportSchema = false
)
abstract class PagingDataBase : RoomDatabase() {
    abstract fun getAnimeDao(): AnimeDao
    abstract fun getPageKeyDao(): PageKeyDao
}

次のページ
APIから取得したデータをDBに保存してキャッシュをする場合

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
アプリケーション開発の最新トレンド連載記事一覧

もっと読む

この記事の著者

長濱 伶(ヤフー株式会社)(ナガハマ レイ)

 2000年沖縄県生まれ。 学生時代に計算機シミュレーションを用いた文化の安定性に関する研究に従事。 2021年3月に沖縄工業高等専門学校のメディア情報工学科卒業後、4月にヤフー株式会社に入社。 2021年7月からPayPayフリマのAndroidアプリ開発に携わる。 Twitter: @Fel1Tech

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/15314 2022/02/17 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング