Kotlinを使用したAndroidのSharedPreferences

このチュートリアルでは、Kotlinを使用してAndroidアプリケーションでSharedPreferencesを実装する方法について学びます。

AndroidのSharedPreferencesとは何ですか?

SharedPreferencesは、APIレベル1からAndroid APIの一部です。これは、データをローカルに保存/変更/削除するためのインターフェースです。一般的に、ログインフォームなどのユーザーのローカルデータをキャッシュするために使用されます。データはキーと値のペアの形式で保存されます。SharedPreferencesデータを保持するために複数のファイルを作成することもできます。

SharedPreferencesのメソッド

SharedPreferencesについての重要なメソッドを見てみましょう。

  • getSharedPreferences(String, int) method is used to retrieve an instance of the SharedPreferences. Here String is the name of the SharedPreferences file and int is the Context passed.
  • The SharedPreferences.Editor() is used to edit values in the SharedPreferences.
  • We can call commit() or apply() to save the values in the SharedPreferences file. The commit() saves the values immediately whereas apply() saves the values asynchronously.

Kotlinを使ってSharedPreferencesの値を設定・取得する方法

私たちは、Kotlinを使用してSharedPreferenceインスタンスに値を設定することができます。

val sharedPreference =  getSharedPreferences("PREFERENCE_NAME",Context.MODE_PRIVATE)
var editor = sharedPreference.edit()
editor.putString("username","Anupam")
editor.putLong("l",100L)
editor.commit()

値を取得するために:

sharedPreference.getString("username","defaultName")
sharedPreference.getLong("l",1L)
android shared preference types

SharedPreferencesのレコードをクリアおよび削除するためのKotlinコード

私たちは、clear() メソッドと remove(String key) メソッドを呼び出すことで、全ての値をクリアしたり特定の値を削除することもできます。

editor.clear()
editor.remove("username")

注意:コミットまたは適用後のエディターへの変更は考慮されません。SharedPreferenceから値を保存および取得する方法は、Javaで行う方法とほぼ同じです。では、Kotlinの魔法はどこにあるのでしょうか?次に、Androidアプリケーションの例を通じて見てみましょう。

アンドロイドのSharedPreferences Kotlinプロジェクトの構造

android shared preference kotlin project

1. コードの配置

以下に activity_main.xml レイアウトファイルのコードが示されています。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/inUserId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:hint="User ID"
        android:inputType="number" />

    <EditText
        android:id="@+id/inPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/inUserId"
        android:hint="Password"
        android:inputType="textPassword" />

    <Button
        android:id="@+id/btnSave"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/inPassword"
        android:text="SAVE USER DATA" />

    <Button
        android:id="@+id/btnClear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/btnSave"
        android:text="CLEAR USER DATA" />

    <Button
        android:id="@+id/btnShow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/inPassword"
        android:text="SHOW" />

    <Button
        android:id="@+id/btnShowDefault"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/btnSave"
        android:text="Show Default" />


</RelativeLayout>

2. MainActivityのKotlinコード。

下記にMainActivity.ktのKotlinクラスのコードが記載されています。

package com.scdev.androidlysharedpreferences

import android.content.Context
import android.content.SharedPreferences
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.preference.PreferenceManager
import android.view.View
import com.scdev.androidlysharedpreferences.PreferenceHelper.defaultPreference
import com.scdev.androidlysharedpreferences.PreferenceHelper.password
import com.scdev.androidlysharedpreferences.PreferenceHelper.userId
import com.scdev.androidlysharedpreferences.PreferenceHelper.clearValues
import com.scdev.androidlysharedpreferences.PreferenceHelper.customPreference

import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity(), View.OnClickListener {

    val CUSTOM_PREF_NAME = "User_data"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        btnSave.setOnClickListener(this)
        btnClear.setOnClickListener(this)
        btnShow.setOnClickListener(this)
        btnShowDefault.setOnClickListener(this)

    }

    override fun onClick(v: View?) {
        val prefs = customPreference(this, CUSTOM_PREF_NAME)
        when (v?.id) {
            R.id.btnSave -> {
                prefs.password = inPassword.text.toString()
                prefs.userId = inUserId.text.toString().toInt()
            }
            R.id.btnClear -> {
                prefs.clearValues

            }
            R.id.btnShow -> {
                inUserId.setText(prefs.userId.toString())
                inPassword.setText(prefs.password)
            }
            R.id.btnShowDefault -> {

                val defaultPrefs = defaultPreference(this)
                inUserId.setText(defaultPrefs.userId.toString())
                inPassword.setText(defaultPrefs.password)
            }
        }
    }


}

object PreferenceHelper {

    val USER_ID = "USER_ID"
    val USER_PASSWORD = "PASSWORD"

    fun defaultPreference(context: Context): SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)

    fun customPreference(context: Context, name: String): SharedPreferences = context.getSharedPreferences(name, Context.MODE_PRIVATE)

    inline fun SharedPreferences.editMe(operation: (SharedPreferences.Editor) -> Unit) {
        val editMe = edit()
        operation(editMe)
        editMe.apply()
    }

    var SharedPreferences.userId
        get() = getInt(USER_ID, 0)
        set(value) {
            editMe {
                it.putInt(USER_ID, value)
            }
        }

    var SharedPreferences.password
        get() = getString(USER_PASSWORD, "")
        set(value) {
            editMe {
                it.putString(USER_PASSWORD, value)
            }
        }

    var SharedPreferences.clearValues
        get() = { }
        set(value) {
            editMe {
                it.clear()
            }
        }
}


Kotlin Android Extensionsのおかげで、XMLの各ビューにfindViewByIdを使わなくても済みます。上記のコードでは、objectキーワードを使ってシングルトンクラスを作成しています。editMe()という名前のインラインの高階関数を宣言しており、その中に編集操作のロジックがあります。各値のために別々のプロパティを作成しました。共有プリファレンス内のデータを取得および設定するために、getおよびset Kotlinプロパティを使用しています。Kotlinはコードの冗長性を削減し、よりきれいに見えます。さらに、以下に示す別のKotlinの高階関数を使用することで、より簡潔にすることができます。

fun SharedPreferences.Editor.put(pair: Pair<String, Any>) {
    val key = pair.first
    val value = pair.second
    when(value) {
        is String -> putString(key, value)
        is Int -> putInt(key, value)
        is Boolean -> putBoolean(key, value)
        is Long -> putLong(key, value)
        is Float -> putFloat(key, value)
        else -> error("Only primitive types can be stored in SharedPreferences")
    }

値を設定する間に、私たちは以下のことを行います。

var SharedPreferences.password
        get() = getString(USER_PASSWORD, "")
        set(value) {
            editMe {
                it.put(USER_PASSWORD to value)
            }
        }
android shared preferences kotlin app output

以下のリンクからソースコードをダウンロードできます: AndroidlySharedPreferences

コメントを残す 0

Your email address will not be published. Required fields are marked *