<Concepts of Persistence>
*데이터 저장 방법
-File Read/Write: (문자열, boolean값, 숫자값은 sharedPreference가 더 쉽다. )
-SharedPreference
-Database
*File
-자바 API로 File Read/Write
-File: 파일 및 디렉토리를 지칭하는 클래스
-FileInputStream/ FileOutputStream: 파일에서 바이트 스트림(이미지 데이터)으로 데이터를 읽거나 쓰는 클래스
-FileReader / FileWriter: 파일에서 문자열 스트림으로 데이터를 읽거나 쓰는 클래스
-파일이 저장되는 곳을 내장 메모리 공간(앱만 이용할 수 있는 저장공간)과 외장 메모리 공간으로 구분된다. 그리고 외장 메모리 공간은 앱별 저장공간(특정 앱만을 위한)과 공유 저장공간으로 구분
-내장 메모리 공간이란 앱이 설치되면 시스템에서 자동으로 할당하는 메모리 공간
-앱의 패키지명(식별자)으로 폴더를 만들어 주며 이 폴더가 이 앱의 내장 메모리 공간
<SharedPreference>
-데이터를 key-value 형태로 저장
-내부적으로 내장 메모리의 앱 폴더에 XML파일로 데이터가 저장
(얻는 방법)
-Activity.getPreferences(int mode): 하나의 액티비티를 위한 데이터 저장을 목적으로 한다. 이 함수를 이용한 액티비티 클래스명으로 xml 파일이 만들어진다.
-Context.getSharedPreferences(String name, int mode): 이 방식이 보다 일반적이다, 앱 전체의 데이터를 key-value 형태로 저장, 가장 큰 특징은 앱 전역에 이용된다는 것!
*데이터 저장 및 획득 기법
-데이터를 저장하기 위해서는 SharedPreferences.Editor 클래스의 함수를 이용
-SharedPreferences.Editor 객체는 SharedPreferences의 edit() 함수로 획득한다.
-commit() 하는 순간 저장된다
**참고**
-apply()를 써서 변경사항을 저장할 수도 있다. 이는 메모리내 SharedPreferences 객체를 즉시 변경하지만 업데이터를 디스크에 비동기적으로 쓴다. commit()을 사용하면 데이터를 디스크에 동기적으로 쓸 수 있다. 이 때문에 기본스레드에서 호출되는 것은 피해야한다. 왜냐면 ui렌더링이 일시중지될 수있기 때문이다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val editView = findViewById<EditText>(R.id.editView)
val checkView = findViewById<CheckBox>(R.id.checkView)
val saveButton = findViewById<Button>(R.id.saveButton)
val getButton = findViewById<Button>(R.id.getButton)
val resultView = findViewById<TextView>(R.id.resultView)
val sharedPref = getSharedPreferences("my_prefs", Context.MODE_PRIVATE)
//버튼 눌렀을때 데이터 저장 및 추출
saveButton.setOnClickListener {
sharedPref.edit().run{
putString("data1", editView.text.toString())
putBoolean("data2", checkView.isChecked)
commit()
}
}
getButton.setOnClickListener {
val data1 = sharedPref.getString("data1", "none")
val data2 = sharedPref.getBoolean("data2", false)
resultView.text = "data1: $data1, data2: $data2"
}
}
}
<settings xml>
-앱의 환경설정 자동화
-res/xml 폴더에 설정과 관련된 xml파일을 작성한다
--부가적 설명 구글링으로 넣기--
(settings.xml)
-PreferenceScreen: 설정 화면단위, 중첩이 가능하며 중첩된 내용은 별도의 화면에 나옴
-PreferenceCategory: 설정 여러개를 시각적으로 묶어서 표현
-CheckboxPreference: 체크박스가 나오는 설정
-EditTextPreference: 글 입력을 위한 설정
-ListPreference: 항목 dialog를 위한 설정
-MultiSelectListPreference: 항목 dialog인데 체크박스가 자동추가되어 여러 선택 가능
-RingtonPreference: Rington 선택을 위한 설정
-SwitchPreference: Switch를 이용한 설정, 가장많이 사용될 것
*실습
implementation 'androidx.preference:preference-ktx:1.2.0'
setting.xml
*루트태그는 <PreferenceScreen>이 되어야한다
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!--두개를 관련되있는것 처럼 묶어 출력할것이므로-->
<PreferenceCategory
app:key="a_category"
title="A Setting">
<SwitchPreference
app:key="a1"
app:title="A - 1 Setting"/>
<SwitchPreferenceCompat
app:key="a2"
app:title="A -2 Setting"/>
</PreferenceCategory>
<PreferenceCategory
app:key="B_category"
app:title="B Setting">
<SwitchPreferenceCompat
app:key="b1"
app:title="B -1 Setting"/>
</PreferenceCategory>
</PreferenceScreen>
settingFragment.kt
*xml특성에서 계층구조를 확장하려면 PreferenceFragmentCompat을 만들고 onCreatePreferences()를 재정의하여 확장하기 위한 xml리소스를 제공해야한다.
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.settings, rootKey)
}
}
settingFragment.xml
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SettingsFragment"
class="org.techtown.c56.SettingsFragment"/>
<PreferenceFragmentCompat>
-설정을 위한 xml만 만들어 적용시켜주면 설정화면이 나오고 유저가 설정항목을 클릭하면 설정내용이 자동으로 저장
-어떤 경우에는 설정 xml의 설정 부분을 코드에서 제어 필요
-설정항목을 클릭하는 순간의 이벤트를 처리하고 싶거나 코드가 실행되어 발생한 결과를 설정항목의 title 혹은 summary로 지정하고 싶은 경우 코드에서 제어 할 수 있다.
*SimpleSummaryProvider
-<EditTextPreference>, <ListPreference>에 의한 설정한 값이 화면에 출력된다.
-유저가 입력한 값을 summary에 작성해주는것
-만약 원하는 형태로 summary 지정하고 싶다면 SummaryProvider의 하위클래스를 만들어서 할 수 있다.
*setOnPreferenceClickListener()을 이용하면 이벤트 처리가 필요시 이용할 수 있다.
*유저가 설정을 변경한 순간을 감지해 변경한 값을 이용해야 하는경우
-Preference.onPreferenceChangeListener 을 이용하는 방법은 각 Preference 객체에 적용
-SharedPreferences.OnSharedPreferenceChangeListener은 모든 설정 객체의 변경을 하나의 이벤트 핸들러에서 감지하기 위한 방법
(실습)
build.gradle
implementation 'androidx.preference:preference-ktx:1.2.0'
settings.xml
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<SwitchPreferenceCompat
android:key="serverFlag"
android:summaryOff="서버연동이 비활성화 되어 있습니다"
android:summaryOn="서버연동이 활성화 되어 있습니다"
android:title="서버연동"/>
<PreferenceCategory
android:dependency="serverFlag"
android:title="서버연동정보">
<EditTextPreference
android:key="serverId"
android:title="ID"/>
<ListPreference
android:key="sound_list"
android:title="서버 메시지 알림음"
android:entries="@array/array_voice"
<!--저장할값 지정-->
android:entryValues="@array/array_voice"
</PreferenceCategory>
</PreferenceScreen>
arrays.xml
<resources>
<string-array name="array_voice">
<item>카톡</item>
<item>카톡왔숑</item>
<item>카카오톡</item>
</string-array>
</resources>
'Frontend > Kotlin' 카테고리의 다른 글
Unit 7 (0) | 2023.01.22 |
---|---|
Unit 7-2(데이터 베이스 프로그램) 강의정리 (0) | 2023.01.21 |
Unit 6 (0) | 2023.01.18 |
Solution:카카오 소셜 로그인 구현 (0) | 2023.01.10 |
Unit 5 (0) | 2023.01.10 |