【kotlin】超簡単なMVPを実装してみた、②LocalRepository設定(ローカルデータに保存、読み込み)

# はじめに
今回はMVP(アーキテクチャ)に沿って、LocalRepository設定(ローカルデータに保存、読み込み)を実装していきたいと思います。

本記事は「【kotlin】超簡単なMVPを実装してみた、①Presenter」の内容を引き継いで実装しています。

これまでの内容は
[【kotlin】超簡単なMVPを実装してみた、①Presenterの実装](https://qiita.com/Na0yaKub0/items/d688c440dfa9c3a49a7f)
をご参照ください

# 実装内容
LocalRepository(ローカルデータに保存、読み込み)まで実装する。
①EditTextに文字を入力してボタンを押したら、文字を保存し、下部のTextViewに表示させる。
②アプリを閉じ、再起動したら保存した文字を読み取り、下部のTextViewに表示させる。
![presenter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784089/327d668f-79fd-381d-ac6a-bec60fe05c83.png)

# 実装
**[レイアウト]**
※前回と同じです。
①editText
②button
③textView
![presenterのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784089/454cf019-aae6-2ece-6d36-ea7a8186396b.png)

**[コード]**
**・LocalRepository設定**
※LocalRepositoryの役割はPresenterに橋渡し、Presenterで使用するメソッドを定義する。
※SharedPreferencesを使用する。
①LocalRepositoryを作成。
②LocalRepositoryで使用するメソッドを追加する。

```kotlin:LocalRepository
interface LocalRepository {

    //②文字を保存するメソッド
    fun saveText(text: String)

    //②文字を読み込むメソッド
    fun loadText():String

}
```

③PreferencesManagerを作成。
④戻り値にLocalRepositoryを導入する。
⑤SharedPreferenceインスタンス化。
⑥LocalRepositoryで設定したメソッドが出るので設定。
※SharedPreferencesの使い方は割愛させていただきます。

```kotlin:PreferenceManager
//④戻り値にLocalRepositoryを導入する。
class PreferenceManager(context: Context): LocalRepository {

    //⑤SharedPreferenceインスタンス化。
    val sharedPref = context.getSharedPreferences("my_settings", Context.MODE_PRIVATE)

    //⑥文字を保存する処理
    override fun saveText(text: String) {
        sharedPref.edit().putString("a",text).apply()
    }

    //⑥文字を読み出す処理
    override fun loadText():String {
        return sharedPref.getString("a","初期値")!!
    }
}

```



**・Presenter設定**
①Presenterの引数にLocalRepositoryを追加
②LocalRepositoryのメソッドを呼び出し使用する。

```kotlin:MainPresenter
//①Presenterの引数にLocalRepositoryを追加
class MainPresenter(private val view: MainContract.View, private val localRepository:  LocalRepository): MainContract.Presenter {

    init {
        view.presenter = this
    }

    override fun start() {
        //②文字を呼び出す
        val text =localRepository.loadText()
        view.showTextView(text)
    }

    override fun onClickButton(text: String) {
        //②文字を保存する
        localRepository.saveText(text)
        view.showTextView(text)
    }
}

```

**・View設定**
View側
①Presenterに引数にpreferenceManagerを追加

```kotlin:MainFragment
class MainFragment: Fragment(),MainContract.View {

    override lateinit var presenter: MainContract.Presenter
    lateinit var editText :EditText
    lateinit var button :Button
    lateinit var textView :TextView

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_main, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        editText = view.findViewById<EditText>(R.id.editTextText)
        button = view.findViewById<Button>(R.id.button)
        textView = view.findViewById<TextView>(R.id.textView)

        //①Presenter初期化
        initPresenter()
        presenter.start()

        button.setOnClickListener{
            presenter.onClickButton(editText.text.toString())
        }
    }
    override fun showTextView(text: String) {
        textView.text = text
    }
    fun initPresenter() {
        if (::presenter.isInitialized) {
            return
        }
        context?.let {
            presenter = MainPresenter(this, PreferenceManager(it))
        }
    }
}

```
以上、LocalRepositoryの実装でした。
次回Retrofitを使用したRemoteRepository設定(APIのやり取り)の設定を記事にしたいと思います。

# 関連記事
[【kotlin】超簡単なMVPを実装してみた、①Presenterの実装](https://qiita.com/Na0yaKub0/items/d688c440dfa9c3a49a7f)
[【kotlin】超簡単なMVPを実装してみた、③RemoteRepository設定(APIのやり取り)](https://qiita.com/Na0yaKub0/items/57358d689b6552ad7d75)

# 参考資料
[Android アプリ設計パターン入門](https://peaks.cc/books/architecture_patterns)
[テストが書けない人のAndroid MVP](https://www.amazon.co.jp/%E3%83%86%E3%82%B9%E3%83%88%E3%81%8C%E6%9B%B8%E3%81%91%E3%81%AA%E3%81%84%E4%BA%BA%E3%81%AEAndroid-MVP-%E6%8A%80%E8%A1%93%E3%81%AE%E6%B3%89%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%88NextPublishing%EF%BC%89-%E9%AB%98%E7%95%91-%E5%8C%A1%E7%A7%80/dp/4844398717)
[todo-mvp](https://github.com/android/architecture-samples/tree/todo-mvp-kotlin/todoapp)