【Android 】SharedPreferencesでデータを保存する方法(Kotlin編)
 
										この記事ではシンプルなデータを保存するときに便利な SharedPreferences の使い方を紹介します。
保存できるデータは String や Int など限られていますが、ゲームのスコアなどちょっとした値を保存するのに便利な機能です。
開発環境
Sample プロジェクトを作成して、MainActivity.kt にコードを書いていきます。
| Android Studio | Koala | 2024.1.1 | 
|---|---|
| minSdk | 21 | 
| targetSdk | 34 | 
SharedPreferencesの使い方
1. ファイルの用意
まずはファイル名を strings.xml に準備しておきます(4行目)。
<resources>
    <string name="app_name">Sample</string>
    <string name="preference_key">"com.example.sample.PREFERENCE_KEY"</string>
</resources>重複したファイルが作成されないように、ファイル名は「パッケージ名.ファイル名」とするのが一般的です。
ファイル名は長くなったり複数のアクティビティから使用することが多いので、strings.xml に文字列を用意しておくことをオススメします。
MainActivity.kt を開いて、7行目のコードを追加します。
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 省略
        // 1. 用意
        val sharedPref = getSharedPreferences(getString(R.string.preference_key), Context.MODE_PRIVATE)
    }
}1つ目の引数がファイル名で、先ほど strings.xml に用意した文字列を指定しています。
2つ目の引数は MODE_PRIVATE(プライベートモード)にしておきます。
さらに簡単に書ける場合
アクティビティが1つしかない場合、1つのアクティビティ内で1つのファイルしか使わない場合は、以下のように書くことができます。
val sharedPref = getPreferences(Context.MODE_PRIVATE)2. 値を保存する
基本的な型の値を保存することができますが、ここでは String 型と int 型の値を保存してみます。
MainActivity.ktに9・10行目のコードを追加します。
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        // 省略
        // 1. 用意
        val sharedPref = getSharedPreferences(getString(R.string.preference_key), Context.MODE_PRIVATE)
        // 2. 保存する
        sharedPref.edit().putString("NAME", "山田").apply()
        sharedPref.edit().putInt("NUMBER", 123).apply()
    }
}キーと値をセットにして保存するので putString(“キー”, “値”) のように書きます。
値を更新するときは、同じキーを使えば上書きされます。
便利な書き方
保存・更新・削除など SharedPreferences に変更を加えるときは edit() と apply() をセットで実行する必要があります。
sharedPref.edit().実行する処理.apply()保存するデータがたくさんある場合は、スコープ関数 with を使うとコードを簡略化することができます。(6〜10行目)。
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        // 省略
        // 2. 保存する
        with(sharedPref.edit()) {
            putString("NAME", "山田")
            putInt("NUMBER", 123)
            apply()
        }
    }
}3. 値を取り出す
値を取り出すときは、6・7行目のように書きます。
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        // 省略
        // 3. 取り出す
        val name = sharedPref.getString("NAME", "?")
        val number = sharedPref.getInt("NUMBER", 0)
    }
}getString、getInt メソッドの2つ目の引数は、値が保存されていない場合の値です。
4. 値を削除する
6行目のコードで、保存した値を全て削除することができます。
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        // 省略
        // 4. 削除する
        sharedPref.edit().clear().apply()
}特定の値だけ削除する場合は remove(“キー”) と書きます。
sharedPref.edit().remove("NAME").apply()完成コード
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_main)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }
        // 1. 用意
        val sharedPref = getSharedPreferences(getString(R.string.preference_key), Context.MODE_PRIVATE)
        //val sharedPref = getPreferences(Context.MODE_PRIVATE)
        // 2. 保存する
        // sharedPref.edit().putString("NAME", "山田").apply()
        // sharedPref.edit().putInt("NUMBER", 123).apply()
        with(sharedPref.edit()) {
            putString("NAME", "山田")
            putInt("NUMBER", 123)
            apply()
        }
        // 3. 取り出す
        val name = sharedPref.getString("NAME", "?")
        val number = sharedPref.getInt("NUMBER", 0)
        Log.v("MY_LOG", "---削除前---")
        Log.v("MY_LOG", "$name")
        Log.v("MY_LOG", "$number")
        // 4. 削除する
        sharedPref.edit().clear().apply()
        //sharedPref.edit().remove("NAME").apply()
        
        val name2 = sharedPref.getString("NAME", "?")
        val number2 = sharedPref.getInt("NUMBER", 0)
        Log.v("MY_LOG", "---削除後---")
        Log.v("MY_LOG", "$name2")
        Log.v("MY_LOG", "$number2")
    }
}



