본문 바로가기

Android/개념 및 예제

SharedPreference로 데이터 저장하기

 
SharedPreference는 앱의 데이터를 영속적으로 저장하기 위한 클래스입니다.

데이터를 간단하게 키-값(key-value) 성격으로 저장합니다.

SharedPreference로 저장하는 데이터는 결국 파일(XML)로 저장되지만, 개발자가 직접 파일을 읽고 쓰는 코드를 작성하지 않고 SharedPreference 객체를 이용해서 데이터를 저장할 수 있습니다.

SharedPreference 객체를 획득하는 방법

SharedPreference 객체를 획득하는 방법은 두 가지가 있습니다.

  • getPreferences(int mode)
  • getSharedPreferences(String name, int mode)

getPreferences은 별도의 파일명을 지정하지 않아 액티비티 이름의 파일 내에 저장됩니다.

예를 들어 MainActivity에서 getPreferences() 함수로 SharedPreference 객체를 획득하면 MainActivity.xml에 저장됩니다.

다른 액티비티에서는 데이터를 이용할 수 없습니다.

val sharedPref = getPreferences(Context.MODE_PRIVATE)

getSharedPreferences() 함수는 파일명에 대한 정보를 매개변수로 지정하므로 해당 이름으로 XML 파일을 만듭니다.

다른 액티비티나 컴포넌트들이 데이터를 공유할 수 있습니다.

데이터가 많아서 이를 각각의 파일로 구분하여 저장할 때 사용합니다.

val sharedPref = getSharedPreferences("my_prefs", Context.MODE_PRIVATE)

 

두 가지 이외에도 PreferenceManager.getDefaultSharedPreferences를 통해서 SharedPreference 객체를 가져올 수 있지만 

PreferenceManager는 API Level 29에서 deprecated 됐기 때문에 사용을 지양해야 합니다.

PreferenceManager.getDefaultSharedPreferences() 함수는 별도의 파일명을 명시하지 않고, 앱 패키지명을 파일명으로 사용합니다.

만약 패키지 명이 "com.example.test"라면 파일명은 "com.example.test_preferences"가 되며 다른 컴포넌트에서도 사용 가능합니다.

val sharedPref = PreferenceManager.getDefaultSharedPreferences(this)

mode 값

SharedPreference 객체를 획득할 때 사용하는 모드 값은 다음과 같습니다.

  • MODE_PRIVATE: 자기 앱 내에서 사용. 외부 앱에서 접근 불가
  • MODE_WORLD_READABLE: 외부 앱에서 읽기 가능
  • MODE_WORLD_WRITEABLE: 외부 앱에서 쓰기 가능
MODE_WORLD_READABLE 및 MODE_WORLD_WRITEABLE 모드는 API 수준 17부터 지원 중단되었습니다.
Android 7.0(API 수준 24)부터 Android에서 이러한 모드를 사용하면 SecurityException이 발생합니다.

 

 

데이터 저장하기

데이터를 저장하려면 Editor 클래스의 함수를 이용합니다.

  • putBoolean(String key, boolean value)
  • putFloat(String key, float value)
  • putInt(String key, int value)
  • putLong(String key, long value)
  • putString(String key, String value)

저장한 데이터를 반영하기 위해서는 commit() 또는 apply() 함수를 호출합니다.

val sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
val editor: SharedPreferences.Editor = sharedPref.edit()
editor.putString("data99", "hi")
editor.putInt("data100", 222)
editor.commit()

 

데이터 가져오기

데이터를 가져오기 위해서는 SharedPreference 클래스의 getter 함수를 사용합니다.

  • getBoolean(String key, boolean defValue)
  • getFloat(String key, float defValue)
  • getInt(String key, int defValue)
  • getLong(String key, long defValue)
  • getString(String key, String defValue)
val sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
val data99: String = sharedPref.getString("data99", "none")
val data100: Int = sharedPref.getInt("data100", 0)