키 - 값 데이터 저장
앱의 데이터들을 저장하여 관리해야하는 상황에서 데이터가 많거나 중요한 데이터라면 서버나, 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는 단일 객체만 존재한다.
'Android > TIL' 카테고리의 다른 글
Android Activity Life cycle (2) | 2023.03.08 |
---|