KotlinでのAndroidのアプリ開発をしています。
Androidでデータを保存する方法は
- プリファレンス(Preferences)
- 内部ストレージ
- ユーザ設定
- データベース
- 外部ストレージ
今回は1.プリファレンスの使い方と他アクティビティからのアクセス方法を紹介します。
プリファレンス(Preferences)
プリファレンス(Preferences)はキーと値のペアでデータを保存できます。
用途としては少量のデータを保存したいときに使うので、ユーザの情報とかに使えばいいと思います。
保存できるデータはboolean型、float型、int型、long型、String型になります。
宣言
まず、プリファレンスの宣言です。
var pref = PreferenceManager.getDefaultSharedPreferences(this)
prefインスタンスを生成します。第二引数でデータのアクセス権限が変わります。
- MODE_PRIVATE
- このアプリからのみ読み書き可
- MODE_APPEND
- 追加で書き込み
現在は上記の2つから選べます。第1引数はインスタンス名です。
onCreate()外で使うために遅延初期化しておくのがいいそうです。
lateinit var prefs : PreferenceManager//遅延初期化
override fun onCreate(savedInstanceState: Bundle?) {
pref = getSharedPreferences(this)
値の取り出し
var height = pref.getFloat("HEIGHT", 170.0f)
キーのデータ型によってgetStringやgetIntでデータを取り出せます。第2引数はデータがなかった時のデフォルト値です。
val editor = pref.edit()
editor.putFloat("HEIGHT", 100.0)
editor.apply()
同様にputStringやputIntで保存したいデータをキーとペアで保存します。
.apply()で実行されますが、.commit()でもできます。
違いとしては.apply()は非同期処理で、.commit()は同期処理で保存します。
基本的には.apply()を使えばいいかと思います。
この3要素で基本操作はできます。
で、ここまでは他の記事でもよくある解説なのですが
他アクティビティからプリファレンスにアクセスすることもしたいです。
で、これが意外とわからず苦労しました。
普通に2つのアクティビティにプリファレンスインスタンスを作成して、
キー名を同じにしてもデータを共有できません。
調べたり、試行錯誤したところ
.getDefaultSharedPreferences(this)のthisをapplicationContextに変更して、プリファレンス保存メソッドを作成すればいけました。
以下のメソッドをプリファレンスを保存するActivityに追加してください。
private fun SavePreferences(key: String, value: Float) {
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(applicationContext)
val editor = sharedPreferences.edit()
editor.putFloat(key, value)
editor.apply()
}
このSavePreferences()メソッドに保存したい値とキーを(キー名,値)の順で渡してあげるとプリファレンスに保存できます。
中身の処理はごく普通なんですが、メソッド化しないとなぜかうまくいきませんでした。
後はデータにアクセスしたいActivityで
var pref = PreferenceManager.getDefaultSharedPreferences(applicationContext)
var height = pref.getFloat("HEIGHT", 170.0f)
のように、保存した時のキー名でpref.get~すれば値が得られます。
みなさんも是非試してください。