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