#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に関することのみを扱い、保存の詳細なやり方などは他のクラスに任せることで、フラグメントの関心を分離してみましょう。
リポジトリ
「データをどのように永続化するかは教えないけど、メソッドを呼ぶと永続化してくれる人」がいると、フラグメントから呼ぶときに便利そうです。このような役割をする人を
新たに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リポジトリを作りました。アプリのアーキテクチャは公式ドキュメントがあるので、時間のあるときに読んでおきましょう。