웹사이트 검색

Kotlin을 사용하는 Android SharedPreferences


이 튜토리얼에서는 Kotlin을 사용하여 Android 애플리케이션에서 SharedPreferences를 구현하는 방법을 배웁니다.

Android SharedPreferences란 무엇입니까?

SharedPreferences는 API 레벨 1부터 Android API의 일부입니다. 데이터를 로컬에서 저장/수정/삭제할 수 있는 인터페이스입니다. 일반적으로 로그인 양식과 같은 사용자 로컬 데이터를 캐시하는 데 사용됩니다. 데이터는 키-값 쌍의 형태로 저장됩니다. SharedPreferences 데이터를 보관할 파일을 여러 개 만들 수 있습니다.

SharedPreferences 메서드

SharedPreferences에 대한 몇 가지 중요한 메서드를 살펴보겠습니다.

  • getSharedPreferences(String, int) 메서드는 SharedPreferences의 인스턴스를 검색하는 데 사용됩니다. 여기서 String은 SharedPreferences 파일의 이름이고 int는 전달된 컨텍스트입니다.
  • SharedPreferences.Editor()SharedPreferences의 값을 편집하는 데 사용됩니다.
  • commit() 또는 apply()를 호출하여 SharedPreferences 파일에 값을 저장할 수 있습니다. commit()은 값을 즉시 저장하는 반면 apply()는 값을 비동기적으로 저장합니다.

SharedPreferences Kotlin을 사용하여 값 설정/검색

다음과 같은 방법으로 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)

SharedPreferences 레코드를 지우고 제거하는 Kotlin 코드

clear()remove(String key) 메서드를 호출하여 모든 값을 지우거나 특정 값을 제거할 수도 있습니다.

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

참고: 커밋 또는 적용 후 편집기에 대한 변경 사항은 고려되지 않습니다. SharedPreference에서 값을 저장하고 검색하는 위의 방법은 Java에서 수행하는 것과 거의 동일합니다. Kotlin의 마법은 어디에 있습니까? 이것이 우리가 예제 안드로이드 애플리케이션을 통해 다음에 보게 될 것입니다.

Android SharedPreferences Kotlin 프로젝트 구조

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 코틀린 코드

MainActivity.kt Kotlin 클래스의 코드는 다음과 같습니다.

package com.journaldev.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.journaldev.androidlysharedpreferences.PreferenceHelper.defaultPreference
import com.journaldev.androidlysharedpreferences.PreferenceHelper.password
import com.journaldev.androidlysharedpreferences.PreferenceHelper.userId
import com.journaldev.androidlysharedpreferences.PreferenceHelper.clearValues
import com.journaldev.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)
            }
        }

다음 링크에서 소스 코드를 다운로드할 수 있습니다. AndroidlySharedPreferences