SharedPreferences

개념과 정의

  • 안드로이드 앱에서 데이터를 저장하는 방법
  • 프로그램의 설정 정보를 저장한다.
  • xml 포맷의 텍스트 파일에 (키-값) 세트로 저장 (...?)

사용 방법

  • getSharedPreferences(name, mode)
    -> (getPreferences도 사용하긴 하지만..)
    (아직은 무슨 말인지는 잘 모르겠지만.. ㅋㅋ)
    SharedPreferences 클래스
        - Preferences의 데이터(-값 세트)를 관리하는 클래스
        - 응용 프로그램 내의 액티비티 간에 공유하며, 한쪽 액티비티에서 수정 시 다른 액티비티에서도 수정된 값을 읽을 수 있다.
        - 응용 프로그램의 고유한 정보이므로 외부에서는 읽을 수 없다.
    -> name : 데이터를 저장할 xml 파일 이름..?
    -> mode : 파일의 공유 모드
    MODE_PRIVATE : 생성한 XML 파일은 호출한 앱 내에서만 사용 가능
    MODE_WORLD_READABLE(읽기 모드) / MODE_WORLD_WRITEABLE(쓰기 모드)
    -> 예시
    val sharedPref = activity?.getSharedPreferences(
        getString(R.string.preference_file_key), Context.MODE_PRIVATE)
    -> 사용 가능한 데이터 타입
    putBoolean
    putFloat
    putInt
    putLong
    putString
    putStringSet (얘는 뭘까요..?)

실제로 사용해보기


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: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:ems="10"
        android:inputType="textPersonName"
        android:textColor="#000000"
        android:textSize="24sp"
        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:marginTop="32dp"
        android:text="저장하기"
        app:layout_constraintTop_toBottomOf="et_hello"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>
  
</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.kt

package com.android.preference

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import com.android.preference.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(binding.root)
        ViewCompat.setOnApplyWindowInsetsListener(binding.main) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }
        
        // 저장하기 버튼 누르면
        binding.btnSave.setOnClickListener {
            // 데이터를 저장하는 메소드 호출
            saveData()
            // 토스트 메세지 띄우기
            Toast.makeText(this, "Data Saved", Toast.LENGTH_SHORT).show()
        }
        
        // 그 데이터를 가지고 있다가 다시 앱을 시작하면 EditText에 저장한 데이터 출력
        loadData()
    }
    
    // 데이터를 저장하는 메소드
    private fun saveData() {
    	// pref라는 파일에 저장하는 데이터
        val pref = getSharedPreferences("pref", 0)
        val edit = pref.edit()
        
        // ...의 데이터 저장명은 name, 저장할 데이터는 "binding.etHello.text.toString()" 값
        edit.putString("name", binding.etHello.text.toString())
        edit.apply()
    }
    
    // 저장한 데이터들을 앱을 다시 시작하면 불러오는 메소드
    // defalt value는 아무것도 저장하지 않으면 EditText에 띄울 데이터
    private fun loadData() {
        val pref = getSharedPreferences("pref", 0)
        binding.etHello.setText(pref.getString("name", "defalt value"))
    }
}
실행 결과

EditText에 원래 "defalt value"에 정한 데이터가 띄워질 텐데
데이터를 입력하고 저장하기 버튼을 누르면 해당 데이터가 저장된다.
그리고 앱을 완전히 종료하고 다시 시작해도 해당 데이터가 띄워져 있다
profile
김성진의 개발 관련 내용 정리 블로그

0개의 댓글