[Android 기초] 15. SharedPreferences
반응형

 

 

 

 

안드로이드에서의 영구(비휘발성) 데이터 저장법

  1. SharedPreference (설정 정보 저장할 때 많이 사용)
  2. 데이터베이스
  3. 파일

 

 

 


 

 

 

1. Preference란?

 

SharedPreferences로 단순 데이터 저장하기  |  Android Developers

DataStore offers a more modern way of storing local data. You should use DataStore instead of SharedPreferences. Read the DataStore guide for more information. 이 페이지는 Cloud Translation API를 통해 번역되었습니다. SharedPreferences로 단

developer.android.com

  • 프로그램의 설정 정보 (사용자의 옵션 선택 사항 이나 프로그램의 구성 정보)를 영구적으로 저장하는 용도로 사용
  • XML 포맷의 텍스트 파일에 키-값 세트로 정보를 저장
  • SharedPreferences 클래스
    • Preferences의 데이터(키-값 세트)를 관리하는 클래스
    • 응용 프로그램 내의 액티비티 간에 공유하며,
      한쪽 액티비티에서 수정 시 다른 액티비티에서도 수정된 값을 읽을 수 있음
    • 응용 프로그램의 고유한 정보이므로 외부에서는 읽을 수 없음 (내 앱에서만 가능)

 

 

 

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

 

  • getPreferences(int mode)
  • getSharedPreferences(String name, int mode)
  • PreferenceManager.getDefaultSharedPreferences(Context context)

 

 

- getPreferences (mode)

val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE)
  • 한개의 Shared Preference 파일을 사용하는 경우
  • Activity 클래스에 정의된 메소드 이므로, Activity 인스턴스를 통해 접근 가능
  • 별도의 파일명을 지정하지 않으므로 자동으로 액티비티 이름의 파일 내에 저장 (예를 들어, MainActivity에서 getPreferences ( ) 함수로 SharedPreferences를 획득하면 MainActivity.xml에 저장하고 읽게 됨)
    결국, 하나의 액티비티만을 위한 저장 공간이 되어 다른 액티비티에서는 데이터를 이용할 수 없음
    = 생성한 액티비티 전용이므로 같은 패키지의 다른 액티비티는 읽을 수 없음
  • 액티비티와 동일한 이름의 XML 파일 생성

 

 

- getSharedPreferences (name, mode)

val sharedPref = activity?.getSharedPreferences(
        getString(R.string.preference_file_key), Context.MODE_PRIVATE)
  • 여러개의 Shared Preference파일들을 사용하는 경우
    보통 한 개의 설정정보만 저장하는 경우는 거의 없기 때문에, 제일 많이 사용
  • name : 프레퍼런스 데이터를 저장할 XML 파일의 이름
  • mode : 파일의 공유 모드
    • MODE_PRIVATE: 생성된 XML 파일은 해당 애플리케이션 내에서만 액세스가 가능
      모드 부분에 0만 써도 MODE_PRIVATE로 설정
    • MODE_WORLD_READABLE / MODE_WORLD_WRITEABLE: 보안상 이유로 API level 17에서 deprecated
  • 사용 가능한 데이터 타입
    SharedPreferences로 데이터를 저장하려면 Editor 클래스의 함수를 이용
    Editor 클래스의 putter 함수를 이용하여 키-값 형태로 데이터를 저장

 

 

 

 

3. 예제

 

1. activity_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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <EditText
        android:id="@+id/et_hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="여기에 입력하세요"
        android:inputType="textPersonName"
        android:textSize="20sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_save"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="저장하기"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/et_hello" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

2. MainActivity.kt

더보기
package com.limheejin.test

import android.os.Bundle
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.limheejin.test.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        binding.btnSave.setOnClickListener {
            saveData()
            Toast.makeText(this, "데이터가 저장되었습니다.", Toast.LENGTH_SHORT).show()
        }
        loadData()
    }

    private fun saveData() {
        val pref = getSharedPreferences("pref", 0) // 0 = MODE_PRIVATE
        val edit = pref.edit() // 수정 모드
        edit.putString("name", binding.etHello.text.toString())
        // 1번째 인자는 키, 2번째 인자는 실제 담아둘 값
        edit.apply() // 저장 완료
    }

    private fun loadData() {
        val pref = getSharedPreferences("pref", 0)
        binding.etHello.setText(pref.getString("name", ""))
        // 1번째 인자는 키, 2번째 인자는 데이터가 존재하지 않을 경우의 값
    }
}

 

 

 

 

 

 

 

 

반응형
 💬 C O M M E N T