Mokelab Blog

#51 AndroidでToDoアプリを作る - リポジトリ

前回はRoomを使ってToDoエンティティやDAOを作ってみました。今回は、関心の分離を行うため、ToDoリポジトリを作ってみます。

関心の分離

Androidでは、フラグメントのonViewCreatedなどでボタンにリスナーをセットし、タップ時の処理などを記述します。前回作ったDAOを使って、次のようなコードを書くことができます。

// dbはToDoDatabase型
// create()をUIスレッドで呼んでるので、実際には動かない
view.findViewById<Button>(R.id.button).setOnClickListener {
  // titleとdetailは画面の入力内容を取ってくる想定
  val now = System.currentTimeMillis()
  val todo = ToDo(title = "title", detail = "detail", created = now, modified = now)
  db.todoDAO().create(todo)
}

フラグメント内でToDoDAOを直接使って保存しています。 そのため、「保存する際に作成時刻と更新時刻を同じにしておく」といった処理もフラグメント側で行っています。フラグメントの立場からすると、保存されることが大事であり、どのように保存するかは大事ではありません。 フラグメントはUIに関することのみを扱い、保存の詳細なやり方などは他のクラスに任せることで、フラグメントの関心を分離してみましょう。

リポジトリ

「データをどのように永続化するかは教えないけど、メソッドを呼ぶと永続化してくれる人」がいると、フラグメントから呼ぶときに便利そうです。このような役割をする人をリポジトリと呼ぶことがあります。今回はToDoを永続化してくれるToDoリポジトリを作ってみましょう。

新たにrepositoryパッケージを作り、その中にToDoRepositoryをインターフェースとして作ります。

package com.mokelab.mytodo.repository.todo

// ToDoを永続化する機能を提供
interface ToDoRepository {
}

今回はToDoを保存するメソッドを定義してみます。後に必要に応じてメソッドを追加していきます。

interface ToDoRepository {
  suspend fun create(title: String, detail: String)
}

そして実装クラスを作ります。同じパッケージ内でよいでしょう。

package com.mokelab.mytodo.repository.todo

class ToDoRepositoryImpl(private val dao: ToDoDAO): ToDoRepository {
  override suspend fun create(title: String, detail: String) {
    val now = System.currentTimeMillis()
    val todo = ToDo(title = title, detail = detail, created = now, modified = now)
    withContext(Dispatchers.IO) {
      dao.create(todo)
    }
  }
}

もし、今後のアップデートでサーバーに保存したくなった場合、ToDoRepositoryImplの中身だけを書き換えるだけで済みます。

まとめ

関心の分離を行うため、ToDoリポジトリを作りました。アプリのアーキテクチャは公式ドキュメントがあるので、時間のあるときに読んでおきましょう。

本サイトではサービス向上のため、Google Analyticsを導入しています。分析にはCookieを利用しています。