minuco
article thumbnail
Published 2023. 3. 8. 00:45
SharedPreferences Android/TIL

키 - 값 데이터 저장

앱의 데이터들을 저장하여 관리해야하는 상황에서 데이터가 많거나 중요한 데이터라면 서버나, DB, File 형태로 저장한다. 하지만 간단한 설정 값이나 문자열 같은 데이터들은 DB에 저장하기에는 부담스럽고 애매한 경우가 많아 SharedPreferences 를 사용하여 데이터를 관리하면 좀 더 편하게 사용할 수 있다.

SharedPreferences?

저장하려는 키-값 컬레션이 비교적 작은 경우 SharedPreferences API 를 사용해야한다. SharedPreferences 객체는 키-값 쌍이 포함된 파일을 가리키며 키-값 쌍을 읽고 쓸수있는 간단한 메소드를 제공한다.

(간단하게 말하면 sml 파일에 팔요한 데이터를 저장하여 쉽게 읽고 쓰는것)

위치 : data/data/(package_name)/shared_prefs/SharedPreference

공유 환경설정의 핸들 가져오기

다음 메서드중 하나를 호출하여 새로운 공유 환경설정 파일을 생성하거나 기존 파일에 액세스할 수 있다.

  • getSharedPreferences() : 이름으로 식별되는 공유 환경설정 파일이 여러개 필요한 경우 이 메서드를 사용한다. 이름의 첫번째 매개변수로 지정할 수 있다. 앱의 모든 Context 에서 이 메서드를 호출할 수 있다.

객체 얻어오기

getSharedPreferences(String name, int mode)

  • 위 함수를 통해 SharedPreferences 객체를 받아올 수있다.
  • 첫번째 인자 name은 해당 SharedPreferences의 이름이다. 특정 이름으로 생성할수 있고 해당 이름으로 xml 파일이 생성된다고 생각하면 된다.
  • 두번째 인자 mode는 읽고 쓰기 권한 관련된 Mode 라고 생각하면 된다. 일단 MPDE_PRIVATE 를 생각한다.
  • getPreferences(): 활동에 공유 환경설정 파일을 하나만 사용해야 하는 경우 Activity에서 이 메서드를 사용합니다. 이 메서드는 활동에 속한 기본 공유 환경설정 파일을 검색하기 때문에 이름을 제공할 필요가 없다.

생성

val prefs : SharedPreferences = context.getSharedPreferences("Prefs", Context.MODE_PRIVATE)
val editor : SharedPreferences.Editor = prefs.edit() // 데이터 기록을 위한 editor

getSharedPreferences(key, mode)

  • MODE_PRIVATE : 자기 앱내에서만 사용할때 (0을 입력해도 된다)
  • MODE_WORLD_READABLE : 다른 앱에서 읽기 가능
  • MODE_WORLD_WRITEABLE : 다른 앱에서 쓰기 가능
  • 데이터를 기록하기 위해서는 SharedPreferences.Editor 인스턴스를 얻어야한다.
  • 생성한 editor를 사용하여 데이터의 저장, 수정, 삭제가 가능하다.

데이터 저장

editor.putString(key, value)
editor.commit() // 필수

  • 저장된 데이터 불러오기
prefs.getString(key, "")

  • 모든 데이터 삭제
editor.remove(key)
editor.clear()
editor.commit()

SharedPreferences 사용

방법 1

앱의 어디서든 전역적으로 사용하기 때문에 싱글톤 패턴을 사용해서 어디서든 접근 가능하게 만드는게 좋다. (kotlin 에서는 object 키워드를 이용해 주로 사용)

SharedPreferences 클래스는 앱의 다른 액티비티보다 먼저 생성 되어야 다른 곳에 데이터를 넘겨줄 수 있다. 이러기 위해서는 Application 에 해당하는 클래스를 생성한 뒤, 전역변수로 SharedPreferences를 가고 있어야 한다. Application()을 상속받는 MyApplication 클래스를 생성하여, onCreate()보다 먼저 prefs를 초기화 해준다.

class MyApplication : Application() {
    companion object {
        lateinit var prefs: PreferenceUtil
    }

    override fun onCreate() {
        prefs = PreferenceUtil(applicationContext)
        super.onCreate()
    }
}

생성 후 Manifest에 등록해줘야한다.

<application
             ...
             android:name=".MyApplication">
  ...
</application>

SharedPreferences를 변수로 가지고 있는 PreferenceUtil 클래스를 생성한다. getString()과 setString() 메소드를 만들어서 SharedPreferences에 접근하여 데이터를 저장하거나 가져올 것이다.

class PrefsManager(context: Context) {
    private val prefs = context.getSharedPreferences("pref_name", Context.MODE_PRIVATE)

    fun getString(key: String, defValue: String) : String {
        return prefs.getString(key, defValue).toString()
    }

    fun setString(key: String, value: String) {
        prefs.edit().putString(key, value).apply()
    }
}

데이터 저장, 데이터 조회

// 데이터 조회
MyApplication.prefs.getString("email", "no email")

// 데이터 저장
MyApplication.prefs.setString("email", "abcd@gmail.com")

방법 2

Object 를 이용하는 방법.

  • 싱글톤을 정의하는 방법
  • 동반 객체 companion object 를 이용한 팩토리 메소드 구현
  • 익명 클래스 선언

싱글톤싱글톤 패턴 코틀린에선 object 키워드를 이용하여 클래스를 정의함과 동시에 객체를 생성할 수 있다.(싱글톤을 쉽게 구현할 수 있다.

  • java 싱글톤
public class Singleton {
	private static Singleton instance;

	private Singleton() {}

	public static Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
}

  • kotlin 싱글톤
object SharedPreference{

    private const val NAME = "Test"
    private const val MODE = Context.MODE_PRIVATE
    private latedinit var preferences: SharedPreferences

    fun init(context: Context) {
        preferences = context.getSharedPreferences(NAME, MODE)
    }

    ...
}

fun main(args: Array<String>){
    SharedPreference.init(applicationContext)
}

위의 코드처럼 object로 선언하면 클래스 선언과 동시에 객체가 생성된다. 따라서 객체 이름을 통해 property나 메소드에 접근할 수 있다.

object 클래스는 가장 바깥 클래스로 선언될 수도 있고, 내부에 중첩된 클래스 형태로 선언될 수도 있다. 하지만, 어떤 방식으로 선언되었던 간에 존재하는 object는 단일 객체만 존재한다.

SharedPreferences 자동로그인 기능 설명

참고 사이트

 

[Kotlin] Object

Prologue 코틀린에는 static 개념이 없다. 사실 개념이 없다기 보다는 static keyword가 없기 때문에 Java의 static 개념을 코틀린에서 표현할 수 없다. 그래서 이를 어떻게 표현하는지 중점적으로 살펴보겠

woovictory.github.io

참고 사이트

 

키-값 데이터 저장  |  Android 개발자  |  Android Developers

키-값 데이터 저장 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 저장하려는 키-값 컬렉션이 비교적 작은 경우 SharedPreferences API를 사용해야 합니다. SharedPre

developer.android.com

참고 사이트

 

[Android] SharedPreferences 간단하게 사용하기 (Kotlin)

안드로이드 앱을 개발하면서 데이터를 저장하는 방법으로는 여러 가지가 있는데, 오늘은 그중 하나인 SharedPreferences를 사용하는 방법을 알아볼 것이다. SharedPreferences란? SharedPreferences는 간단한

leveloper.tistory.com

참고 사이트

 

android의 SharedPreferences알아보기

IBK시스템 플랫폼 사업팀 블로그입니다. 플랫폼 사업을 진행하면서 경험한 생생한 IT기술을 공유하고자 합니다.

devstory.ibksplatform.com

 

'Android > TIL' 카테고리의 다른 글

Android Activity Life cycle  (2) 2023.03.08
profile

minuco

@minuco

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!