본문 바로가기

Frontend/Kotlin

Unit 7-1 강의정리

<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