2024. 4. 30. 15:50, 📱Android Study
반응형
안드로이드에서의 영구(비휘발성) 데이터 저장법
- SharedPreference (설정 정보 저장할 때 많이 사용)
- 데이터베이스
- 파일
1. Preference란?
- 프로그램의 설정 정보 (사용자의 옵션 선택 사항 이나 프로그램의 구성 정보)를 영구적으로 저장하는 용도로 사용
- 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
- MODE_PRIVATE: 생성된 XML 파일은 해당 애플리케이션 내에서만 액세스가 가능
- 사용 가능한 데이터 타입
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