데이터를 저장하기 위해선 3가지 방법이 있다.
- SharedPreferences
- File
- 로컬 DB Library (Room, SQLite)
개발을 하다보면 계속적으로 필요한 값을 DB로부터 받아 와야할 때가 있다.
이러한 값들을 매번 DB를 통해 호출하다보면, 애플리케이션 성능이 떨어진다.
속도 측면에서는 SharedPreferences 가 가장 빠르기 때문에 작업할 때 빈번하게 사용된다.
주로, 자동 로그인 여부 판별하기 위한 체크용도, 토큰 값 저장 등에 쓰며, 애플리케이션 내에서 간단한 데이터를 저장하는 경우에 DB를 통하기보단 이 방법을 많이 사용하다.
SharedPreferences
애플리케이션 내에 개별 데이터 저장소에 xml 파일을 만든 뒤, 그 파일에 Integer, String 등의 데이터를 읽고 쓰게 됩니다.
SharedPreferences 객체를 생성할 때, 파일 이름을 인자로 전달하여, 그 이름으로 xml 파일이 생성 됩니다.
그 후, 해당 xml 파일에 key / value 형태로 데이터를 저장합니다.
// xml 파일이 저장되는 경로
data/data/패키지명/shared_prefs/SharedPreference
* 프레임워크 별 SharedPreferences 저장 경로가 다르고, xml 데이터 형식 또한 다르다.
두 가지 종류의 환경설정 파일(xml)을 생성하거나 기존 파일(xml)에 엑세스할 수 있는 방법
- getSharedPreferences() : 이름으로 식별하는 공유 환경설정 파일이 여러 개 필요한 경우 이 메서드를 사용. 애플리케이션 내에서 Context 를 통하여 이 메서드를 호출할 수 있다.
- getSharedPreferences(String name, int mode)
- getPreferences() : Acitivity 에 공유 환경설정 파일을 하나만 사용해야하는 경우 Activity 에서 이 메서드를 사용.
- getPreferences(int mode)
Mode 종류
- MODE_PRIVATE: 생성한 앱에서만 사용 가능
- MODE_WORLD_READABLE: 다른 앱과 데이터 읽기 공유
- MODE_WORLD_WRITABLE: 다른 앱과 데이터 쓰기 공유
- MODE_APPEND: 기존 Preference에서 신규로 추가
- MODE_MULTI_PROCESS: 해당 Preference가 사용 중인지 확인
사용하는 방법 [Kotlin]
MainActivity.kt
package com.example.db
import android.content.SharedPreferences
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import org.w3c.dom.Text
class MainActivity : AppCompatActivity() {
private lateinit var editText : EditText
private lateinit var textView : TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
editText = findViewById(R.id.editText)
textView = findViewById(R.id.textView)
}
fun clickSetButton(view : View) {
if (editText.text.toString().isEmpty()) {
Toast.makeText(this, "값을 입력해주세요.", Toast.LENGTH_SHORT).show()
}else {
// 'mSharedPref' 이름으로 xml 환경설정 파일 생성성
val sharedPreferences : SharedPreferences = getSharedPreferences("됨", MODE_PRIVATE)
// sharedPreferences 를 제어할 editor 선언
val editor : SharedPreferences.Editor = sharedPreferences.edit()
// 값 저장
editor.putString("randomData", "hi") // 별도로 그냥 저장.
editor.putString("inputText", editText.text.toString()).commit() // 무조건 commit 은 필수. 그래야 저장
Toast.makeText(this, "저장이 됐습니다.", Toast.LENGTH_SHORT).show()
}
}
fun clickGetButton(view : View) {
// 'mSharedPref' 이름으로 xml 환경설정 파일 생, 만약 'mSharedPref' 로 된 xml 파일이 존재하다면? 해당 기존 파일 불러옵니다.
val sharedPreferences : SharedPreferences = getSharedPreferences("mSharedPref", MODE_PRIVATE)
// 'mSharedPref' 파일 내에서 해당 Key 값을 가져오기
val randData = sharedPreferences.getString("randomData", "default Data")
val inputText = sharedPreferences.getString("inputText", "")
textView.text = inputText
Toast.makeText(this, "$randData 값을 불러옵니다.", Toast.LENGTH_SHORT).show()
}
}
activitiy_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:layout_width="300dp"
android:layout_height="wrap_content"
android:text="Set SharedPreferences"
android:onClick="clickSetButton"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.715" />
<Button
android:layout_width="300dp"
android:layout_height="wrap_content"
android:onClick="clickGetButton"
android:text="Get SharedPreferences"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.495"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.821" />
</androidx.constraintlayout.widget.ConstraintLayout>
참고
https://developer.android.com/training/data-storage/shared-preferences?hl=ko
'Mobile App' 카테고리의 다른 글
[안드로이드] - 도메인 레이어 (Use Case) (0) | 2022.07.25 |
---|---|
[안드로이드] - UI Layer Architecture (0) | 2022.07.23 |
[안드로이드] - Android Preferences data storage (0) | 2022.07.21 |
[안드로이드] - Android Data & File Repository (안드로이드 데이터) (0) | 2022.07.18 |
[안드로이드] - Android Compatibility (앱 호환성) (0) | 2022.07.18 |