[Android] SharedPreferences (안드로이드에서 데이터 저장하기)

이도연·2023년 9월 13일
0

android studio

목록 보기
12/28
post-thumbnail



1. preference 란?

프로그램의 설정 정보(사용자의 기본 설정이나 옵션 선택 사항, 프로그램 구성 정보, 로그인 정보 등)를 영구적으로 저장
xml 포맷의 텍스트 파일에 키-값 쌍으로 데이터를 저장



2. Gradle 파일


//Gradle 플러그인 설정
plugins {
    id 'com.android.application' // Android 앱을 빌드하기 위한 기본 플러그인
    id 'org.jetbrains.kotlin.android' // Kotlin 언어를 사용한 Android 앱을 빌드하기 위한 플러그인
}


// Android 앱 설정
android {
    namespace 'com.android.myapplication' // namespace 는 패키지 이름
    compileSdk 33 // 앱이 컴파일되는 sdk 버전을 지정


    // 앱의 기본 설정
    defaultConfig {
        applicationId "com.android.myapplication"	// 앱의 고유한 식별자
        minSdk 31	// 앱이 실행되는 데 필요한 최소 Android 버전을 지정
        targetSdk 33	// 앱이 대상으로 하는 Android 버전을 지정
        versionCode 1	// 앱의 버전 관리를 위한 정보
        versionName "1.0"	// 앱의 버전 관리를 위한 정보

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    
    
    // 빌드 유형 설정
    // release 빌드 유형은 앱을 출시할 때 사용. 여기에서 ProGuard 및 코드 압축 관련 설정을 구성
    buildTypes {
        release { 
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    
    
    // 컴파일 및 kotlin 옵션
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8 // Java 버전과의 호환성 설정
        targetCompatibility JavaVersion.VERSION_1_8 // Java 버전과의 호환성 설정
    }
    
    // kotlin 컴파일러 옵션을 지정
    kotlinOptions {
        jvmTarget = '1.8'
    }
    
    // 뷰 바인딩 활성화. 뷰 바인딩을 사용하여 xml 레이아웃 파일과 상호 작용할 수 있다. 레이아웃 구성 요소에 쉽게 액세스하고 조작할 수 있다.
    buildFeatures{
        viewBinding true // viewBinding 을 true 로 설정하여 뷰 바인딩 활성화
    }
}


// 의존성 관리
// implementation 키워드를 시용하여 앱에 필요한 라이브러리 의존성을 정의
dependencies {
    implementation 'androidx.core:core-ktx:1.8.0'
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}



3. kotlin 파일

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

class MainActivity : AppCompatActivity() {


    // View Binding 을 사용하여 레이아웃과 상호 작용하기 위한 바인딩 객체 생성
    // 'ActivityMainBinding' 객체를 사용하여 XML 레이아웃과 상호 작용. 이를 위해 View Binding 이 활성화되어야 한다.
    private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

    // 'onCreate' 함수에서 액티비티의 초기화 및 레이아웃 설정이 이루어짐.
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        // "Save" 버튼 클릭 이벤트 처리
        // "Save" 버튼 클릭하면 'saveData()' 메서드가 호출되어 사용자가 입력한 데이터를 SharedPreferences 에 저장
        binding.btnSave.setOnClickListener{
            saveData() // 데이터 저장 메서드 호출
            Toast.makeText(this, "Data Saved.", Toast.LENGTH_SHORT).show()
        }
        // 'loadData()' 메서드는 액티비티가 시작될 때 실행. SharedPReferences 에서 저장한 데이터를 가져와서 'EditText'에 표시
        loadData() // 데이터 불러오기 메서드 호출
    }

    // 데이터 저장 메서드
    private fun saveData() {
        // SharedPreferences 객체 생성
        val pref = getSharedPreferences("pref",0) // "pref"라는 이름의 SharedPreferences 파일 열기
        val edit = pref.edit() // 수정 모드로 열기
        
        // SharedPreferences 에 데이터 저장
        // 1번째 인자는 키, 2번째 인자는 실제 담아둘 값
        edit.putString("name", binding.etHello.text.toString())
        edit.apply() // 변경사항 저장 완료
    }

    // 데이터 불러오기 메서드
    private fun loadData() {
        // SharedPreferences 객체 생성
        val pref = getSharedPreferences("pref",0)
        
        // SharedPreferences 에서 데이터 불러오기
        // 1번째 인자는 키, 2번째 인자는 데이터가 존재하지 않을경우의 값
        binding.etHello.setText(pref.getString("name",""))
    }
}

.
.
.

3-1. 'SharedPreferences' 인스턴스 생성

getSharedPreferences 인스턴스를 생성했다.

val pref = getSharedPreferences("pref", 0)

0은 SharedPreferences의 접근 모드이다.
0은 기본 모드로 사용되며, 앱 내에서 읽기 및 쓰기가 가능하다.

.
.
.

공유 환경설정의 핸들을 가져올 때


다음 메서드 중 하나를 호출하여 새로운 공유 환경설정 파일을 생성하거나 기존 파일에 액세스할 수 있다.
  • 여러 개의 Shared Preference 파일들을 사용하는 경우
    • getSharedPreferences (name, mode)
    • 첫 번째 매개변수로 지정하는 이름
    • 식별되는 여러 공유 환경설정 파일이 필요한 경우 사용
    • 앱의 모든 Context 에서 이 메서드 호출 가능
    • name : Preference data 를 저장한 XML 파일의 이름
    • mode : 파일의 공유 모드
      • MODE_PRIVATE : 자기 앱에서 내에서 사용가능. 외부 앱에서 접근 불가
        • MODE_WORLD_READABLE: 외부 앱에서 읽기 가능 (보안상 이유로 API lv 17에서 deprecated
        • MODE_WORLD_WRITEABLE: 외부 앱에서 쓰기 가능 (보안상 이유로 API lv 17에서 deprecated
val sharedPref = activity?.getSharedPreferences(
	getString(R.string.preference_file_key), Context.MODE_PRIVATE)

.
.

  • 한 개의 Shared Preference 파일들을 사용하는 경우
    • Activity class 에 정의된 메소드이므로 Activity 인스턴스 통해 접근 가능
    • 생성한 Activity 전용이므로 같은 패키지의 다른 Activity는 읽을 수 x
    • 하나의 공유 환경설정 파일만 사용해야 하는 경우 Activity에서 이 메서드를 사용
    • 이 메서드는 Activity 에 속한 기본 공유 환경설정 파일을 검색하기 때문에 이름을 제공할 필요 x
val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE)

.
.
.

3-2. 데이터 저장

val edit = pref.edit() 
edit.putString("name", binding.etHello.text.toString())
edit.apply() 

edit() 메서드를 호출하여 SharedPreferences를 수정할 수 있는 Editor 객체를 가져온다.
putString() 메서드를 사용하여 "name"이라는 키로 EditText에서 가져온 문자열을 저장한 뒤,
apply() 메서드를 호출하여 변경사항을 저장한다.

.
.
.

3-3. 데이터 검색

binding.etHello.setText(pref.getString("name", ""))

getString() 메서드를 사용하여 "name" 키에 해당하는 값을 가져온다.
값이 없는 경우(default) 빈 문자열("")을 반환한다.
반환된 값은 EditText 위젯에 설정되어 사용자에게 표시된다.

  • 위 코드는 사용자 데이터를 영구적으로 저장하지 않고, 앱을 종료하면 데이터가 지워진다.
    ** 간단한 설정 값이나 임시 데이터를 저장하기에는 적합.



4. 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: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:text="Save"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/et_hello" />

</androidx.constraintlayout.widget.ConstraintLayout>

5. 실행화면!


앱 종료 후에도 텍스트 데이터는 저장됨.

0개의 댓글